【问题标题】:Dependency injection: should I inject everything or use a service locator for some objects?依赖注入:我应该注入所有东西还是对某些对象使用服务定位器?
【发布时间】:2012-03-31 19:07:12
【问题描述】:

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

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

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

对于这些类型的对象,你会推荐 DI 吗?

【问题讨论】:

  • 无法回答。你显然知道有利有弊。由您做出有意识的决定。
  • 嗯,问题是:你会为此推荐 DI,所以从这个意义上说,问题很明确。
  • 我赞成并投票结束的问题很少。这是一个很好的问题,但似乎由你来决定。这是您的应用程序,您知道该主题的优缺点。
  • @markus 出于某种原因,我总是建议 DI 而不是 SL。但那只是我的个人意见。回答这个问题是开放式的,因此不适合 SO。也许它应该迁移给程序员。
  • 我不太熟悉程序员模组认为适合那里的东西,但如果适合,那么迁移将是一种选择。我认为这是一个重要的问题,我很想了解人们的原因(包括你的原因,@Gordon)。

标签: php zend-framework dependency-injection


【解决方案1】:

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

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

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

【讨论】:

  • 是的。但是,在某些情况下,使用服务定位器是进行依赖倒置的唯一方法。例如,当一个类被不支持依赖注入的第三方框架实例化时。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-29
  • 2011-05-07
  • 1970-01-01
  • 2013-01-21
  • 1970-01-01
相关资源
最近更新 更多