依赖注入:我应该为一些对象注入所有内容还是使用服务定位器?

aim*_*eld 9 php dependency-injection zend-framework

我目前正在使用服务定位器重构基于Zend Framework的PHP库(构造函数)依赖注入(DI).我觉得它改进了我的代码很多,但我不确定是否应该注入所有依赖项.对于使用很多且非特定的依赖项,服务定位器似乎更容易.我有以下依赖项,我仍然使用服务定位器访问:

  1. Zend_Translate对象(我需要在任何地方翻译消息).
  2. Zend_Locale对象(存储当前语言)
  3. 一个Zend_Config对象(很多东西都可以通过ini-file配置)
  4. 实用程序类的实例(用于数组和字符串操作)

如果我注入了这些依赖项,它们会使我的构造函数混乱并分散特定的依赖关系.为了测试,我可以在运行测试之前在我的服务定位器中设置这些依赖项.我的实用主义者说我做得很好,但纯粹主义者说我应该一直用DI.

你会推荐DI用于这些类型的物体吗?

Mar*_*ann 18

当涉及到对构造函数混乱的担忧时,很可能是代码气味,这些类违反单一责任原则.构造函数注入在这里是非常有益的,因为它使这更加明显.

有些人还担心注入很少使用的依赖项,但这也不是问题.在创建对象图时,性能很少成为问题,即使是,虚拟代理模式也可以解决它.

简而言之,没有理由使用服务定位器.总有一种更好的选择涉及适当的控制反转.

  • 真正.但是,有些情况下使用服务定位器是进行依赖性反转的唯一方法.例如,当一个类由不支持依赖注入的第三方框架实例化时. (2认同)