7

最近,我一直在尝试了解使用服务定位器“反模式”和使用 Castle Windsor 容器之间的区别。我在 Internet 上到处找到一些信息,并在一篇未完成的博客文章中总结了我迄今为止所学到的知识。

编辑:到目前为止,我一直认为依赖注入是保证分离所需要的。但无论我看哪里,我都看到了向温莎城堡等集装箱方向发展的趋势。我想清楚地了解原因。请...向我解释一下,就像我是 6 岁:)

4

3 回答 3

18

有趣的是,您应该像六岁一样要求对其进行解释;这是一个像你五岁的解释:)

在我所见的任何地方,我都看到朝着温莎城堡等集装箱的方向推进

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

这就是为什么在我的书中,我解释了所有 DI 概念,而没有将解释耦合到任何单个 DI 容器。这实际上是本书的大部分内容。

服务定位器和依赖注入是实现松耦合的两种根本不同的尝试。Service Locator 有很多缺点,并且没有 DI 不具备的优点。这就是为什么我认为将 Service Locator 称为反模式是安全的。

使用 DI 不需要 DI 容器;事实上,我会说除非你采取一种相当复杂的方法,否则最好避免使用.

于 2013-04-23T18:25:33.003 回答
3

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

于 2013-04-21T14:52:01.007 回答
3

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

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

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

于 2013-04-20T16:22:49.653 回答