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


Dependency injection: should I inject everything or use a service locator for some objects?

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

  1. Zend_Translate对象(我需要到处翻译消息)
  2. Zend_Locale对象(存储当前语言)
  3. Zend_Config对象(很多东西都可以通过ini文件进行配置)
  4. 实用程序类的实例(用于数组和字符串操作)

如果我注入这些依赖项,它们会打乱我的构造函数,分散我对特定依赖项的注意力。对于测试,我可以在运行测试之前在服务定位器中设置这些依赖项。我内心的实用主义者说我做得很好,但纯粹主义者说我应该一直支持DI。

对于这些类型的对象,您是否推荐DI?

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

有些人还担心注入很少使用的依赖项,但这也不是问题。当涉及到创建对象图时,性能很少是一个问题,即使是这样,虚拟代理模式也可以解决这个问题

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