【发布时间】:2012-02-12 14:47:09
【问题描述】:
通常,当我需要将一个或多个服务注入另一个服务时,我会显式地注入每个服务。但是,我有一种情况,注入服务容器本身会让事情变得更容易。我知道这不是推荐的做法,但我很好奇阻止这种做法的技术原因是什么。它是合理的,比如它太耗费资源,还是更个人的感觉它太乱了?
【问题讨论】:
标签: php symfony dependency-injection
通常,当我需要将一个或多个服务注入另一个服务时,我会显式地注入每个服务。但是,我有一种情况,注入服务容器本身会让事情变得更容易。我知道这不是推荐的做法,但我很好奇阻止这种做法的技术原因是什么。它是合理的,比如它太耗费资源,还是更个人的感觉它太乱了?
【问题讨论】:
标签: php symfony dependency-injection
如果你注入容器,你并没有明确依赖关系。事实上,你比以前更模糊了它们。如果你有这样的课程...
class DocumentCreator(IFileNamer fileNamer, IRepository repository)
{ ... }
...您可以看到依赖项是什么。您还可以轻松地模拟这些依赖项以进行单元测试,以确保隔离 DocumentCreator,并且可以知道任何测试失败都是其代码的结果,而不是其依赖项之一中的代码。
另一方面,如果你这样做......
class DocumentCreator(IDependencyContainer container)
{ ... }
...您已经掩盖了依赖关系。如果不检查该类的内部结构,您无法知道它需要一个 IFileNamer 和一个 IRepository。
您也不能轻易知道需要在容器中放入哪些模拟来测试 DocumentCreator。模拟 IDependencyContainer 根本不会帮助你;你的类仍然会在测试中失败,因为容器不包含 IFileNamer 和 IRepository,除非你检查类的内部以查看它们是必需的。
【讨论】:
你描述的是一个ServiceLocator。这在现代应用程序设计中被认为是一种反模式。 This article 描述了原因。
【讨论】:
我认为这种方法的主要问题是您不再清楚地看到依赖关系。另一个问题可能是它更难测试。
【讨论】: