6

最近我一直在阅读很多关于 IoC、DI 和服务定位器的内容,但一个问题突然出现在我的脑海中。有时 DI 使用容器来调用依赖项,对吗?但是那个容器不是服务定位器吗?

我看不出这两者之间的区别。

4

2 回答 2

4

是的,在Composition Root之外使用或传递DI 容器Service Locator。根据 Mark Seemann 的定义,组合根是:

组合根是模块组合在一起的应用程序中的(最好)唯一位置。

因此,只要您在唯一位置使用容器,它就不是Service Locator

关于Service Locator的使用:有时你不能只使用一个Composition Root来配置你的应用程序、外部库或框架的一部分。在这种情况下,您可以使用配置为仅创建预定义和有限类型资源的抽象工厂而不是容器。这是Mark Seemann 的另一篇文章“模式识别:抽象工厂还是服务定位器?”

于 2012-12-24T09:46:42.660 回答
2

容器注册您的依赖项并可以解决它们。另一方面,定位器使用容器来解析服务。

为了能够使用容器,您必须对它有一个引用。另一方面,定位器通常是静态可用的,您不需要对它的引用。

Locator 被认为是一种反模式,因为它可以让您“就地”解决任何依赖关系,这实际上使依赖关系隐含。这意味着类客户端直到它出现在运行时才知道依赖关系。

于 2012-12-23T21:05:08.713 回答