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相同的约定。
将容器传递给工厂没有任何问题,如果将工厂暴露为单例,这样做很有效,因此获取实例不需要再次传递容器。
另一个选择是在工厂中使用服务定位器解析容器,因为定位器是单例,这种方法类似于前者。