php - 避免注入(inject)服务容器而不是单个服务的技术原因是什么?

标签 php symfony dependency-injection

通常,当我需要将一项或多项服务注入(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/

相关文章:

php - IF 语句需要以一定的宽度显示文本并且只在主页上显示

php - ZF2 弃用 : ServiceManagerAwareInterface

javascript - tinymce 捆绑返回 Markdown

php - 需要帮助从 ManyToOne 获得 OneToMany 关联

symfony - Assetic 和我的 Assets

c# - IoC 工厂 : Pros and contras for Interface versus Delegates

java - 指南 : Inject mulitple implementation in Single Class constructor

php - 编写自定义查询来获取 WordPress 数据/使用 WordPress 表创建 JSON

php - 为什么 PHP 中两个字符串相加 "+"会产生这个结果?

php - 删除数组键前缀