团结和依赖于对象的收集

时间:2011-03-22 07:58:15

标签: .net collections unity-container

在我的情况下,某些类不依赖于单个对象,而是依赖于它们的集合:

public class ImportController { ...
public ImportController(IEnumerable<IImportManager> managers) { ... }
}

public class ProductAImportManager : IImportManager { ... }
public class ProductBImportManager : IImportManager { ... }
public class ProductCImportManager : IImportManager { ... }

我想使用Unity实例化ImportController,那么我该如何注册依赖项呢?

如果我使用

之类的东西
unityContainer.RegisterType<IImportManager, ProductAImportManager>();
unityContainer.RegisterType<IImportManager, ProductBImportManager>();

第二个电话只会覆盖第一个电话。

有没有办法让Unity找到所有注册的实现IImportManager接口的类型,实例化这些类型并将对象序列传递给我的构造函数?

2 个答案:

答案 0 :(得分:5)

在涉及多个注册时,Unity有一些奇怪的解决规则。

  • 没有姓名的注册(例如container.RegisterType<IInterface, Implementation>())只能 才能通过container.Resolve解决。

  • 使用container.ResolveAll<IInterface>()解析使用姓名进行的注册

我用来依赖注册集合的技巧是一种在幕后调用ResolveAll的双线方法:

public static class UnityExtensions {  
   public static void RegisterCollection<T>(this IUnityContainer container) where T : class {
    container.RegisterType<IEnumerable<T>>(new InjectionFactory(c=>c.ResolveAll<T>()));
  }
}

从现在开始,用法很简单。

//First register individual types
unityContainer.RegisterType<IImportManager, ProductAImportManager>("productA");
unityContainer.RegisterType<IImportManager, ProductBImportManager>("productB");
//Register collection
unityContainer.RegisterCollection<IImportManager>();
//Once collection is registered, IEnumerable<IImportManager>() will be resolved as a dependency:
public class ImportController { ...
  public ImportController(IEnumerable<IImportManager> managers) { ... }
}

答案 1 :(得分:3)

您可以使用命名类型和数组:

unityContainer.RegisterType<IImportManager, ProductAImportManager>("a");
unityContainer.RegisterType<IImportManager, ProductBImportManager>("b");


public class ImportController { ...
   public ImportController(IImportManager[] managers) { ... }
}