我目前正在使用服务定位器重构基于Zend Framework的PHP库(构造函数)依赖注入(DI)。我觉得它改进了我的代码很多,但我不确定是否应该注入所有依赖项。对于使用很多且非特定的依赖项,服务定位器似乎更容易。我有以下依赖项,我仍然使用服务定位器访问:
如果我注入了这些依赖项,它们会使我的构造函数混乱,并分散对特定依赖项的注意力。为了测试,我可以在运行测试之前在我的服务定位器中设置这些依赖项。我的实用主义者说我做得很好,但纯粹主义者说我应该一直用DI。
您是否会为这些类型的物品推荐DI?
答案 0 :(得分:18)
当涉及到对构造函数混乱的担忧时,很可能是a code smell that the classes are violating Single Responsibility Principle。构造函数注入在这里是非常有益的,因为它使这更加明显。
有些人还担心注入很少使用的依赖项,但that's not a problem either。在创建对象图时,性能很少成为问题,即使是,虚拟代理模式也可以解决它。
简而言之,没有理由使用服务定位器。总有一个更好的选择涉及适当的控制反转。