在Kozmic的博客(日期为2009年)中,他建议使用Generic Factory从容器中检索对象。嗯,这对我来说似乎是一个伪服务定位器。所以我想问一下专家的意见。
public interface IGenericFactory
{
T Create<T>();
}
我可以使用它来从Windsor容器中获取对象吗?这种方法有什么缺点吗?
更新
实际上,我想用它来获得一些我不想创建多个工厂的瞬态。为所有这些场景设立一家工厂。
答案 0 :(得分:1)
我做了一个快速的Google搜索,发现这篇文章你可能指的是:http://kozmic.pl/2009/12/23/castle-typed-factory-facility-reborn/
如果是这样,那么KrzysztofKoźmic自己说:
[...]您可以毫不费力地使用它来构建通用服务定位器。
是的,现在Service Locator is considered to be an anti-pattern。
然而,这篇文章是关于特例的。作者在第一段中非常清楚地说明了这一点:
使用IoC容器时的一般经验法则是 - 当您在组件中引用容器时(在引导代码之外的任何地方),您做错了。与所有规则一样,也有例外,但它们很少见。
答案 1 :(得分:1)
相反,请考虑以下事项:
public interface IGenericFactory<out T>
{
T Create();
}
接口只需要创建一次,但必须为每个需要解决的服务注入。这样,它就不是通用服务定位器(它是反模式,如前面提到的那样)。
奖励积分:
正常依赖注入要求可以解析依赖关系图中的所有服务。 IGenericFactory<>
将通过键入的工厂设施自动解析。但是在执行Create()
之前,它的泛型类型参数将无法解析。
如果在程序深处的边缘情况下发生这种情况,并且您忘记注册该服务,则在生产之前您可能没有意识到该错误。
解决方案是为IGenericFactory<>
编写一个自定义解析器,检查泛型类型参数是否具有处理程序,并且它不等待注册任何依赖项。有关自定义解析程序的信息,请访问:http://docs.castleproject.org/Windsor.Resolvers.ash