testing - ZF2。替代让 AbstractController(或其他类)实现 ServiceLocatorAwareInterface?

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

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

大多数时候被认为是反模式使用 ServiceLocatorAwareInterface 注入(inject)依赖项?在什么情况下不能将此模式视为反模式?为什么?

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

编辑

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

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

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

Zend\DI 可以提供帮助,但如果有人详细说明这种解决方案的细节,我将不胜感激。

编辑 2

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

here有关此问题的更多信息。

福勒要说的是 here

最佳答案

解决这个问题其实很简单,通过构造函数注入(inject)你的依赖。这消除了很多会在大型应用程序中引起问题的魔力。

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

关于testing - ZF2。替代让 AbstractController(或其他类)实现 ServiceLocatorAwareInterface?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19741779/

相关文章:

php - Zend 框架 2 : active menu items

php - ZF2 如何获取最后插入的 id 值?

android - 使用 Android SDK 进行简单的 Java 类测试

flutter - 如何比较 flutter 单元测试的期望函数中的两个列表?

ruby - 如何使用 Ruby 学习 TDD?

c# - 哪个 DI 容器会满足这个

mvvm - ViewModel 到 ViewModel 的通信

javascript - ng-annotate 控件依赖名称

php - 将 HeadScript javascript 与 widmogrod/zf2-assetic-module 和多个模块中的 js 结合起来

XCode 运行所有测试(甚至是禁用的测试)