一个 DI 容器是服务定位器吗?

6

最近我一直在阅读IoC、DI和服务定位器方面的内容,但是我有一个问题。有时候DI使用容器来调用依赖关系,对吗?但这个容器不是一个服务定位器吗?

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


1
相关链接:http://blog.ploeh.dk/2011/08/25/ServiceLocatorRolesVsMechanics.aspx - Steven
2个回答

4
是的,如果在组合根之外使用或传递DI容器就是服务定位器。根据Mark Seemann的定义,组合根是:

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

因此,只要您在那个唯一的位置使用容器,它就不是服务定位器
关于使用服务定位器:有时,您无法仅使用一个组合根来配置应用程序的某个部分、外部库或框架。在这种情况下,您可以使用非容器但已配置为创建预定义和受限资源类型的抽象工厂。这里还有另一篇由Mark Seemann "模式识别:抽象工厂还是服务定位器?"的文章。

我本来想写一条评论来解释为什么我不完全同意你的答案,但是在重新阅读你的答案后,我发现我们可能是有相同的想法,只是你忘了一个单词。请看我的更新。 - Steven

2

Container(容器)可以注册您的依赖项并解决它们。而定位器(Locator)则使用容器来解决服务。

要使用容器,您必须引用它。另一方面,定位器通常是静态可用的,您不需要引用它。

定位器被认为是反模式,因为它允许您“就地”解决任何依赖关系,这实际上使依赖关系变得隐式。这意味着类客户端直到运行时才会意识到依赖关系。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接