使用Service Locator反模式和使用Castle Windsor容器有什么区别?“

时间:2013-04-20 16:14:55

标签: oop inversion-of-control castle-windsor service-locator

最近,我一直试图了解使用Service Locator“反模式”和使用Castle Windsor容器之间的区别。我在互联网上找到了一些信息,我总结了迄今为止我在an unfinished blog post中学到的知识。

编辑:到目前为止,我一直认为依赖注入是保证分离所需的全部内容。但在我看到的任何地方,我都看到像温莎城堡这样的集装箱方向。我想清楚地了解原因。 请...... Explain this to me like I'm a 6 year old:)

3 个答案:

答案 0 :(得分:18)

有趣的是你应该要求让它解释为你六岁;这是一个explanation like you were five years old:)

  无论我到哪里,我都看到了像温莎城堡这样的容器方向的推动

坦率地说,我认为其原因在于大多数人实际上并不了解依赖注入是什么,这意味着他们不是要理解控制反转的概念,而是寻找{{1}的替代品。他们已经习惯了关键字。然后他们找到一个DI容器并(误)将其用作服务定位器。不幸的是,这很容易做到。

这就是为什么在my book中解释所有DI概念而不将解释与任何单个DI容器相结合的原因。这实际上是本书的大部分内容。

服务定位器和依赖注入是two fundamentally different attempts at achieving loose coupling。服务定位器具有许多缺点,并且没有DI提供的优点。这就是为什么我认为将Service Locator称为反模式是安全的。

您不需要DI容器来使用DI;事实上,我会说unless you take a rather sophisticated approach, it's probably better to avoid one

答案 1 :(得分:3)

服务定位器可能只是围绕特定的控制容器反转的包装器,例如Castle Windsor。关键是,您的代码应该(理想情况下)引用容器的唯一位置是composition root

因为控制容器的反转支持依赖关系链接,所以当您从容器中解析根类型时,将注入其所有依赖关系,以及任何后代依赖关系。

如果您希望在运行时创建更多类型,那么您可以使用工厂,如果您希望利用容器提供的依赖关系链接和接口的容器映射,它们也可以引用您的容器反对实施。

答案 2 :(得分:3)

当您使用服务定位器时,您的代码正在为所有服务调用定位器。当您使用控制反转时,只有一个地方(组合根),您可以在其中调用容器。您应用的其余部分不应该是容器感知的。