IOC“子”容器/服务定位器

时间:2010-04-13 19:41:10

标签: singleton ioc-container service-locator

免责声明:我知道DI和服务定位器模式之间存在争议。我有一个旨在避免辩论的问题。这个问题适用于服务定位器的粉丝,他们碰巧像Fowler一样思考“DI ...很难理解......总的来说,除非我需要,否则我更愿意避免它。”出于我的问题的目的,我必须避免DI(故意不给出的原因),所以我试图引发与我的问题无关的辩论。

问题:我将IOC容器保存在单件中的唯一问题(请记住上面的免责声明)是使用子容器。据推测,儿童容器本身不会是单身人士。起初我认为这是一个真正的问题。但是当我想到它时,我开始认为这正是我想要的行为(子容器不是单例,可以随意使用Disposed())。

然后我的思绪进一步深入到一个哲学领域。因为我是服务定位器粉丝,所以我想知道儿童容器的概念是多么必要。在我看到其有用性的一小部分案例中,它要么是满足DI(我大部分都是在避免),要么问题是可以解决的,而不需要求助于IOC容器。我的想法部分受到IServiceLocator interface的启发,它甚至不愿意列出“GetChildContainer”方法。

所以我的问题就是:如果你是服务定位器粉丝,你是否发现儿童容器通常没有实际意义?否则,什么时候它们必不可少?

额外信用:如果单身中的服务定位器存在其他哲学问题(除了DI倡导者提出的那些),它们是什么?

1 个答案:

答案 0 :(得分:3)

IMHO:

  • 子容器与服务定位器无关,即它们是正交的。使用容器作为服务定位器只是一种使用它的方式,它与支持子容器的容器无关。
  • 儿童容器的使用很大程度上取决于容器的设计。例如,虽然温莎支持它们,但它们很少被使用。 Autofac OTOH大量使用它们来管理范围/组件生命周期。它是任何容器/服务定位器实现的完全可选功能,这就是IServiceLocator没有提到它的原因。 IServiceLocator的工作是在服务定位器中提供最小的公分母。