Unity工厂注射

我有一个类似下面的界面,我注入了统一容器。

public interface IMyInstanceFactory { IEnumerable GetAll(); } 

所有IMyInstance在运行时之前都是已知的,即它们可以在引导程序中设置并且可以从统一检索。 我对IMyInstanceFactory具体实现如下:

 public class MyInstanceFactory:IMyInstanceFactory { IUnityContainer _container; public MyInstanceFactory(IUnityContainer container) { _container = container; } public IEnumerable GetAll() { return _container.ResolveAll(); } } 

..在我的引导程序中,我做了这样的事情:

 container.RegisterType; container.RegisterType; container.RegisterType; container.RegisterType; 

这很好地解决了一切。 但是,我不想依赖于容器或者为此实现IMyInstanceFactory ,有没有办法在没有实现IMyInstanceFactory情况下设置它? Unity是否为此提供了便利?

这种东西……

 container.RegisterTypefactory.GetAll()>().IsResolvedBy(unity.ResolveAll); 

我知道城堡可以做到这一点,Unity可以做类似的事吗?

Unity Windsor Typed工厂设施有一个港口 。 它将生成您的界面的实现并为您执行ResolveAll

您的引导代码应如下所示:

 container.RegisterType("1"); container.RegisterType("2"); container.RegisterType("3"); container.RegisterType(new TypedFactory()); 

GetAll的调用将转换为容器调用ResolveAll

该端口遵循与Windsor相同的约定。

将容器传递给工厂没有任何问题,如果将工厂暴露为单例,这样做很有效,因此获取实例不需要再次传递容器。

另一个选择是在工厂中使用服务定位器解析容器,因为定位器是单例,这种方法类似于前者。