何时使用动作注入,何时在控制器的构造函数上注入依赖项



在Symfony中,您可以直接将服务注入控制器函数:

use AppServiceFooService;
class FooController
{
public function one(FooService $fooService){
$fooService->doSomething();
}
}

但只要付出同样的努力,你就可以在结构中使用它:

class FooController
{
public function __construct(private FooService $fooService){}
public function two(){
$this->fooService->doSomething();
}
}

我正在寻找何时注射和何时不注射的理由/指南。一个或正反两个的性能价格是多少,例如:

  • 您是否必须始终以没有__construct()为目标
  • 如果一个类中的所有方法都使用FooService,我是否仍然在每个方法中加载它们,还是现在使用__construct

我如何决定实施哪个解决方案?

我目前的逻辑是";尽可能多地使用动作注入,因为这节省了初始化所有控制器的时间,缺点是方法调用稍微慢一点,因为现在必须在那里完成;

我认为这个主题处于SO允许的边缘,我正在寻找一个指导规则集,而不是评论或意见

在这两种情况下都没有显著的性能或内存优势,注入的服务是引用,而不是新实例。

在任何情况下,大多数现代设计都不会有具有许多不同方法的控制器。如果同一类的许多公共方法具有非常不同的依赖关系,那么也许所有这些方法一开始就不属于同一类?

最后,这些设计差异是一种风格选择。如今,构造函数注入往往是首选(至少在我周围(,因为由于依赖关系是类必须在有效声明中才能工作的,所以在实例化时传递它们对许多人来说似乎更合乎逻辑。

在许多情况下,将其作为方法参数传递并没有本质上的错误(就像将任何其他类型的callables作为参数一样(,但我认为最好的是将控制器动作视为任何其他方法:

  • 该方法如何读得更清楚
  • 方法使用者是否需要知道类依赖关系,并在调用时更改依赖关系,或者这超出了使用者的职责范围

最新更新