design-patterns - DI 容器是服务定位器吗?

标签 design-patterns dependency-injection inversion-of-control

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

我看不出这两者有什么区别。

最佳答案

是的,在 Composition Root 之外使用或传递 DI 容器是服务定位器。根据 Mark Seemann Compositon 的定义,根是:

A Composition Root is a (preferably) unique location in an application where modules are composed together.



因此,只要您在那个唯一位置使用容器,它就不是服务定位器。

关于 Service Locator 的使用:有时您无法仅使用一个 Composition Root 来配置部分应用程序、外部库或框架。在这种情况下,您可以不使用容器,而是使用配置为仅创建预定义和有限类型资源的抽象工厂。这是 Mark Seemann "Pattern Recognition: Abstract Factory or Service Locator?" 的另一篇文章

关于design-patterns - DI 容器是服务定位器吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14014666/

相关文章:

java - 如何在复合模式中设置不同的参数?

java - 为什么不直接使用构造函数呢?

javascript - 如何创建可重用的 Socket.IO 模块

inversion-of-control - 结构图 : EqualToAppSetting with non string constructor argument

dependency-injection - DI容器如何工作的最简单解释?

java - 当列表达到一定数量时执行操作

C# 工厂模式

java - 如何覆盖 Dagger 2 范围内的依赖项

wpf - 解析结构图中的窗口或如何管理 WPF MVVM 中的多个窗口?

c# - 如何将参数传递给依赖项通过 IoC 容器连接的类?