2011-10-25 40 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>); 
}); 
相關問題