And*_*yTS 5 .net collections unity-container
在我的情况下,某些类不依赖于单个对象,而是依赖于它们的集合:
public class ImportController { ...
public ImportController(IEnumerable<IImportManager> managers) { ... }
}
public class ProductAImportManager : IImportManager { ... }
public class ProductBImportManager : IImportManager { ... }
public class ProductCImportManager : IImportManager { ... }
Run Code Online (Sandbox Code Playgroud)
我想使用Unity实例化ImportController,那么我应该如何注册依赖项呢?
如果我使用类似的东西
unityContainer.RegisterType<IImportManager, ProductAImportManager>();
unityContainer.RegisterType<IImportManager, ProductBImportManager>();
Run Code Online (Sandbox Code Playgroud)
第二次通话只会覆盖第一次通话.
有没有办法让Unity找到所有注册的实现IImportManager接口的类型,实例化这些类型并将对象序列传递给我的构造函数?
在涉及多个注册时,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>()));
}
}
Run Code Online (Sandbox Code Playgroud)
从现在开始,用法很简单.
//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) { ... }
}
Run Code Online (Sandbox Code Playgroud)