我正在重构基于Zend Framework的
PHP库,使用服务定位器((constructor))依赖注入(DI).我觉得它改进了我的代码很多,但我不知道我是否应该注入所有的依赖关系.一个服务定位器似乎更容易依赖,这些依赖使用了很多,而且是非特定的.我有以下依赖关系,我仍然使用服务定位器访问:
>一个Zend_Translate对象(我需要翻译各地的消息).
> Zend_Locale对象(存储当前语言)
> Zend_Config对象(很多东西都可以通过ini-file配置)
>实用程序类的实例(用于数组和字符串操作)
如果我注入了这些依赖项,那么它们会混乱我的构造函数,并分散特定依赖关系.对于测试,我可以在运行测试之前在我的服务定位器中设置这些依赖项.我中的实用主义者说我做得很好,但纯粹主义者说我应该跟DI一起去.
你会推荐DI这些类型的对象吗?
当涉及到对构造函数的混乱的关注时,最有可能的是
a code smell that the classes are violating.在这里,构造函数注入是非常有益的,因为它使得这更加明显.
有些人也担心注入很少使用的依赖关系,但是that’s not a problem either.当涉及到创建对象图时,性能很少是一个问题,即使是这样,虚拟代理模式也可以解决它.
简而言之,没有理由使用服务定位器.总有一个更好的选择涉及正确的控制倒置.