【问题标题】:ZF2. Alternative to having the AbstractController (or another classes) implementing the ServiceLocatorAwareInterface?ZF2。替代实现 ServiceLocatorAwareInterface 的 AbstractController(或其他类)?
【发布时间】:2013-11-13 12:58:01
【问题描述】:

blog post 上,人们可以阅读三个避免在控制器内部使用$this->getServiceLocator() 的原因。我认为这些原因不仅适用于控制器类,而且适用于实现ServiceLocatorAwareInterface 接口的任何类。

大多数时候被认为是一种反模式,使用ServiceLocatorAwareInterface注入依赖项?在什么情况下这种模式不能被认为是反模式?为什么?

谁能详细说明替代解决方案(我认为可能使用 Zend\DI)可能是什么?更具体地说,如何避免使用 ServiceLocatorAwareInterface ModulesControllersBussiness/Domain 类。我很想了解有关 Zend\DI 及其解决方案的性能问题。

编辑

当我最后唯一能得到的是将“注入器代码”(以前的$this->getServiceLocator()->get($serviceName))移动到工厂而不解决测试问题时,是否值得为具有两个或三个依赖项的类定义工厂?当然,我也想测试我的工厂?还是没有?

我认为工厂必须保留在对象构建涉及复杂任务的情况下。在我看来,当类具有很少的依赖项和零逻辑(除了依赖项解决)时,工厂解决方案是对这个问题的过度杀伤。此外,通过这个解决方案,我将以更多的代码来测试(工厂)和更多的测试(测试工厂),同时尽量避免在测试实现中使用更少的代码。模拟服务定位器是一件容易的事,因为接口只有两个方法,模拟代码可以在所有测试用例之间共享。

如果我错了,请纠正我;)

Zend\DI 可能会有所帮助,但如果有人详细说明这种解决方案的具体细节,我将不胜感激。

编辑 2

几周前this Zend 网络研讨会(“ZF2 领域驱动设计简介”)使用了这种反模式(39:05)。我现在一直在徘徊,直到这真的是一种反模式;)

还有here 更多关于这个问题的信息。

福勒不得不说的是here

【问题讨论】:

    标签: testing dependency-injection zend-framework2 inversion-of-control service-locator


    【解决方案1】:

    其实很容易解决这个问题,通过构造函数注入你的依赖。这消除了许多会在大型应用程序中引起问题的魔法。

    所以这意味着您需要创建工厂而不是使用可调用的类。 如这里的文档所示:http://framework.zend.com/manual/2.2/en/modules/zend.service-manager.intro.html

    【讨论】:

    • 感谢您的回复安托万。我同意你的观点,构造函数注入是一种解决方案,但我的问题是如何在 ZF2 上下文中具体实现该解决方案(或另一个解决方案)。例如。我可以在哪里定义 Module 类的工厂?(如果我可以在不更改 ModuleManager 实现的情况下做这样的事情)我现在将编辑我的问题以添加其他一些对此问题的担忧。再次感谢。
    • 这是个人品味的问题......我通常将我的工厂放在上下文文件夹之外。所以如果有一个控制器“Foo\Controller\IndexController”我会把工厂放在“Foo\ControllerFactory\IndexControllerFactory”
    • 如果我错了,请纠正我,但如果你说这是通过接口注入 ServiceLocator 的反模式,那么 zend 初始化器对我来说几乎是一样的。当你通过 ServiceManager 初始化器创建你的类的实例时,检查你的类是否实现了特定的接口,然后你使用 setter 注入依赖。
    • 由于它们引起的问题和执行不力,许多人也认为它们是不好的做法。但是你应该试着和 ocramius 谈谈这件事……twitter.com/ocramius
    【解决方案2】:

    如果您使用 ServiceLocatorAwareInterface,最后一个 ZF2 版本(zendframework/zend-mvc 2.7.0 和 +)会引发 Depracated 警告,并且 ZF 文档(在撰写此答案时)不清楚并且仍然使用这个接口。 ZF“大师”不谈论更新文档。如果您不是 ZF2 专家(在撰写此答案时),则很难找到具体示例。

    但幸运的是,Rob Allen 几年前写了一篇文章来解释如何删除 SL 依赖并将其注入您的控制器:https://akrabat.com/injecting-dependencies-into-your-zf2-controllers/ 这解决了问题。希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 2013-10-28
      • 2013-04-03
      • 1970-01-01
      • 2011-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-12
      • 1970-01-01
      相关资源
      最近更新 更多