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

时间:2012-03-15 09:25:05

标签: php zend-framework dependency-injection

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

  1. Zend_Translate对象(我需要在任何地方翻译消息)。
  2. Zend_Locale对象(存储当前语言)
  3. Zend_Config对象(很多东西可由ini文件配置)
  4. 实用程序类的实例(用于数组和字符串操作)
  5. 如果我注入了这些依赖项,它们会使我的构造函数混乱,并分散对特定依赖项的注意力。为了测试,我可以在运行测试之前在我的服务定位器中设置这些依赖项。我的实用主义者说我做得很好,但纯粹主义者说我应该一直用DI。

    您是否会为这些类型的物品推荐DI?

1 个答案:

答案 0 :(得分:18)

当涉及到对构造函数混乱的担忧时,很可能是a code smell that the classes are violating Single Responsibility Principle。构造函数注入在这里是非常有益的,因为它使这更加明显。

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

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