城堡温莎通用型工厂

时间:2012-04-05 16:10:15

标签: c# .net castle-windsor castle

在Kozmic的博客(日期为2009年)中,他建议使用Generic Factory从容器中检索对象。嗯,这对我来说似乎是一个伪服务定位器。所以我想问一下专家的意见。

  public interface IGenericFactory
  {
        T Create<T>();
  }

我可以使用它来从Windsor容器中获取对象吗?这种方法有什么缺点吗?

更新

实际上,我想用它来获得一些我不想创建多个工厂的瞬态。为所有这些场景设立一家工厂。

2 个答案:

答案 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