2016-02-16 74 views
0

如果我在下面的代碼中使用AutoFac設置我的依賴關係,我如何確保objects.ToList()返回一個包含X個元素的列表?在構造函數中獲取X型Y的實例

public interface IClassA { ... } 
public class ClassA : IClassA { ... } 

public interface IClassB { ... } 
public class ClassB : IClassB 
{ 
    public ClassB(IEnumerable<IClassA> objects) 
    { 
    } 
} 

目前的集裝箱建築的代碼(注意,這是與TopShelf連用):

public static class DependencyContainer 
{ 
    public static IContainer BuildContainer() 
    { 
     var builder = new ContainerBuilder(); 

     builder.RegisterType<ClassA>().As<IClassA>(); 
     builder.RegisterType<ClassB>().As<IClassB>().SingleInstance(); 

     return builder.Build(); 
    } 
} 
+1

什麼是不工作?有了這個註冊,你應該在你的ClassB構造函數中得到一個包含一個元素的IClassA數組... – nemesv

+0

@nemesv是的,但我想要一個包含4個元素的數組。或10.或X.我需要能夠配置多少個。當然它需要不同的實例。 – user1151923

回答

2

如果你添加以下到您DependencyContainer類,那麼你可以指出哪些情況下應該注入ClassB構造:

builder.Register(c => 
       return new [] { c.Resolve<IClassA>(), c.Resolve<IClassA>() }) 
      .As<IEnumerable<IClassA>>(); 

所以:

public static class DependencyContainer 
{ 
    public static IContainer BuildContainer() 
    { 
     var builder = new ContainerBuilder(); 

     builder.RegisterType<ClassA>().As<IClassA>(); 
     builder.RegisterType<ClassB>().As<IClassB>().SingleInstance(); 

     builder.Register(c => 
      return new [] { c.Resolve<IClassA>(), c.Resolve<IClassA>() }) 
       .As<IEnumerable<IClassA>>(); 

     return builder.Build(); 
    } 
} 

如果你想動態創建一些在運行時,你可以添加以下到DependencyContainer類:

public static IEnumerable<IClassA> CreateInstances(IComponentContext component) 
{ 
    const int number = 3; // <-- YOU COULD READ THIS FROM A CONFIG FILE 
    List<IClassA> instances = new List<IClassA>(); 

    for(int i = 0; i < number; i++) 
    { 
     instances.Add(component.Resolve<IClassA>()); 
    } 

    return instances; 
} 

然後更換Register(c => return new [] { ... })有:

builder.Register(c => CreateInstances(c)).As<IEnumerable<IClassA>>(); 
相關問題