2011-10-25 2 views
1

홈페이지 :StructureMap : 생성자 내에서 명명 된 인스턴스를 얻는 방법

class Program 
{ 
    static void Main() 
    { 
     new CompositionRoot(); 

     Console.WriteLine("Test"); 
     var consumer = ObjectFactory.GetInstance<Consumer>(); 
     consumer.Parse(); 
     Console.ReadLine(); 
    } 
} 

파서 :

public interface IFilePaser 
{ 
    void Parse(string line); 
} 

public class ITMFileParser : IFilePaser 
{ 
    public void Parse(string line) 
    { 
     Console.WriteLine("ITM"); 
    } 
} 

public class SEQFilePaser : IFilePaser 
{ 
    public void Parse(string line) 
    { 
     Console.WriteLine("SEQ"); 
    } 
} 

CompositionRoot :

public class CompositionRoot 
{ 
    public CompositionRoot() 
    { 
     ObjectFactory.Initialize(x=>x.Scan(scan => 
               { 
                scan.AssembliesFromApplicationBaseDirectory(); 
                scan.AddAllTypesOf<IFilePaser>().NameBy(NameBy); 
               })); 

     Consumer.Factory = ObjectFactory.GetNamedInstance<IFilePaser>; 
    } 



    private static string NameBy(Type type) 
    { 
     return type.Name.Replace("FileParser", ""); 
    } 
} 

소비자 :

public class Consumer 
{ 
    public static Func<string, IFilePaser> Factory = name => { throw new NotImplementedException(""); }; 

    public void Parse() 
    { 
     Factory("ITM").Parse(""); 
    } 
} 

내가이가 소비자를 리팩토링 다음 사용하려면 어떻게해야합니까?

public class Consumer 
{ 
    private readonly Func<string, IFilePaser> _filePaser; 

    public Consumer(Func<string, IFilePaser> filePaser) 
    { 
     _filePaser = filePaser; 
    } 

    public void Parse() 
    { 
     _filePaser("ITM").Parse(""); 
    } 
} 

답변

2

StructureMaps Func<T> 명명 된 인스턴스에는 트릭이 구현되지 않습니다. 명시 적으로 등록해야합니다.

ObjectFactory.Initialize(x => { 
    x.Scan(scan => { 
     scan.AssembliesFromApplicationBaseDirectory(); 
     scan.AddAllTypesOf<IFileParser>().NameBy(NameBy); 
    }); 

    x.For<Func<string, IFileParser>>().Use(ObjectFactory.GetNamedInstance<IFileParser>); 
}); 
관련 문제