0

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

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

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

更新:

实际上,我只想用它来获得一些我不想为其创建多个工厂的瞬态。为所有此类场景拥有一个工厂。

4

2 回答 2

1

我做了一个快速的谷歌搜索,发现你可能指的是这篇文章:http: //kozmic.pl/2009/12/23/castle-typed-factory-facility-reborn/

如果是这样,那么 Krzysztof Koźmic 自己说:

[...] 您可以毫不费力地使用它来构建通用服务定位器

是的,现在Service Locator 被认为是一种反模式

但是,这篇文章是关于特殊情况的。作者在第一段中说得很清楚:

使用 IoC 容器时的一般经验法则是——当您在组件中(在引导代码之外的任何地方)引用容器时,您做错了。与所有规则一样,也有例外,但很少见。

于 2012-04-18T19:34:03.637 回答
1

相反,请考虑以下事项:

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

该接口只需要创建一次,但必须为您需要解析的每个服务注入它。这样,它就不是一个通用的服务定位器(这是一个反模式,如 w0lf 之前提到的)。

奖励积分:

正常的依赖注入要求可以解析依赖图中的所有服务。 IGenericFactory<>将通过类型化的工厂设施自动解决。但是它的泛型类型参数在执行之前不会被解析Create()

如果这种情况发生在程序深处的边缘情况下,并且您忘记注册服务,那么您可能直到生产时才意识到该错误。

解决方案是编写一个自定义解析器,用于IGenericFactory<>检查泛型类型参数是否具有处理程序,并且它没有等待注册任何依赖项。有关自定义解析器的信息在这里: http ://docs.castleproject.org/Windsor.Resolvers.ash

于 2013-10-10T22:03:02.090 回答