何时在我的控制器中实例化一个新类以及何时将该类作为依赖项注入?

时间:2017-07-18 15:42:48

标签: php oop dependency-injection instantiation

我何时使用>>> ''.join(reversed(a_str)) '?yletelpmoc gnisrever ton ti si yhW' 在我的控制器中创建任何类,何时类注入我的控制器?

例如,假设我有一个new类(它通过读取域实体内部的注释来构建AnnotationBuilder对象。)

我可以在控制器内部调用它:

Zend\Form

或者我可以将$form = (new AnnotationBuilder())->createForm(MyForm::class); 的实例传递给我的控制器,然后像这样调用它:

AnnotationBuilder

或者如果我直接将$form = $this->annotationBuilder->createForm(MyForm::class); 传递给方法,我可以使用:

AnnotationBuilder

这有什么指导方针吗?例如,阅读依赖注入我可以冒险猜测我必须说明我的所有依赖项,并且由于$form = $annotationBuilder->createForm(MyForm::class); 是构建表单所需的部分,我可以将它注入到我的构造函数中控制器。或者作为setter方法。

其他课程怎么样?目前在我现有的控制器中,我可以计算大约6个AnnotationBuilder运算符。我是否盲目地将它们重构为全部传递给控制器​​?

在控制器内使用new创建内容是否可以接受?

2 个答案:

答案 0 :(得分:0)

这取决于模型层的复杂程度。在AnnotationBuilder的情况下,我肯定会将其作为依赖项传递,但不一定在控制器中。我不是Zend用户,并且不知道它实际上做了什么,但这听起来像“输出内容”,应该放在View实例中(如果你有那些而不仅仅是哑模板)。

一般来说,我会有代码,其中控制器只与模型层中的各种服务进行交互。而且由于每个运行时这些服务都是单一的,因此最好将它们作为依赖项传递。

但是在每个服务中我会兼顾各种实体(域对象)。而且,虽然每个运行时只有一个Authentication服务,但在其中可能会管理多个Identity(或者Account个)实体。这些“重复实例”我将作为依赖项传递。相反,我会使用new运算符或使用某个工厂创建它们(这将是一个依赖项,用于单元测试目的)。

我希望它有所帮助。

答案 1 :(得分:0)

我认为遵循规则并不是一个好主意,因为有人这么说。有理由这样做很重要。

注射东西和实施它之间有什么关系?

我发现它更重要的场景是在单元测试中。你对控制器进行单元测试?如果是,AnnotationBuilder是你要模仿的东西,因为它会影响性能还是出于其他原因?

除了测试用例之外,具有这种具体依赖性是一个问题,或者你应该注入它的抽象?对于最后一个,一般来说,我没有看到控制器的问题取决于混凝土,因为它只是应用程序的基础设施入口点。