通常,当我需要将一项或多项服务注入(inject)另一项服务时,我会显式地注入(inject)每一项。但是,我有一种情况,注入(inject)服务容器本身确实会让事情变得更容易。我知道这不是推荐的做法,但我很好奇阻止这种做法的技术原因是什么。它是合法的东西,比如它太耗费资源,还是更个人的感觉,它太乱了?
最佳答案
如果你注入(inject)容器,你并没有明确依赖关系。事实上,你比以前更能掩盖他们。如果你有这样的类(class)......
class DocumentCreator(IFileNamer fileNamer, IRepository repository)
{ ... }
...您可以看到依赖项是什么。您还可以轻松模拟这些依赖项以进行单元测试,以确保您隔离 DocumentCreator 并且可以知道任何测试失败都是其代码的结果,而不是其依赖项之一中的代码。
另一方面,如果您这样做...
class DocumentCreator(IDependencyContainer container)
{ ... }
...你已经掩盖了依赖关系。如果不检查类的内部结构,您将无法知道它需要一个 IFileNamer 和一个 IRepository。
您也无法轻易知道需要在容器中放入哪些模拟来测试 DocumentCreator。模拟 IDependencyContainer 根本帮不了你;你的类仍然会在测试中失败,因为容器不包含 IFileNamer 和 IRepository,除非你检查类的内部结构以查看它们是必需的。
关于php - 避免注入(inject)服务容器而不是单个服务的技术原因是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8900710/