当前位置: 首页 > 知识库问答 >
问题:

何时使用操作注入,何时注入控制器对构造函数的依赖关系?

秦才英
2023-03-14

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

use App\Service\FooService;

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

我在寻找什么时候注射什么时候不注射的理由/指南。其中一种或赞成/反对的性能价格是多少,例如:

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

我如何决定我实现哪种解决方案?

我当前的逻辑是“尽可能多地使用动作注入,因为这样可以节省初始化所有控制器的时间,但缺点是方法调用会稍微慢一些,因为现在必须在那里进行。”

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

共有1个答案

漆雕彬彬
2023-03-14

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

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

最终,这些设计上的差异是一种风格上的选择。现在,构造函数注入往往是首选的(至少在我周围),因为依赖项是类需要具有的有效声明才能工作,所以在实例化时传递它们对许多人来说似乎更合乎逻辑。

在许多情况下,将其作为方法参数传递并没有本质上的错误(如将任何其他类型的callableS作为参数),但我认为最好的做法是将控制器操作视为任何其他方法:

  • 该方法如何读得更清楚?
  • 方法使用者是否需要知道类依赖项,并在调用时更改依赖项,或者这超出了使用者的责任范围?
 类似资料:
  • 我正试图在计算机上实现这个例子https://developer.android.com/jetpack/docs/guide.这就解释了Android应用程序的结构。 当我使用相同的代码时,我会出现以下错误。 我可以找出这个错误与 当我为ViewModel编写默认的零输入构造函数时,我得到了以下错误。 我想不出这个错误的原因和解决方法。

  • 好的,到目前为止还好。但是等等,突然A需要额外的输入,比如一个对它的构造至关重要的名为“amount”的整数。现在,我的A构造函数需要如下所示: 突然这个新参数干扰了注射。此外,即使这确实有效,我也无法在从提供者检索新实例时输入“金额”,除非我弄错了。这里有几件事我可以做,我的问题是哪一件是最好的? 我可以通过添加一个方法来重构A,该方法应该在构造函数之后调用。然而,这是很难看的,因为它迫使我推迟

  • 和另一个类: 在这种情况下,服务将按照预期注入到A类中。据我所知,你不能在a类中使用构造函数,否则注入将无法工作。有没有一种方法可以在a类中使用一个构造函数,同时注入服务?即: 在这种情况下,我得到的服务是空的,无论如何要解决这个问题?我希望能够从类型A中使用“new”创建一个对象,并注入服务,这可能吗?

  • 在之前的所有JUnit版本中,测试构造函数或方法都不允许有参数(至少不能使用标准的Runner实现)。作为JUnit Jupiter的主要变化之一,测试构造函数和方法现在都允许有参数。这带来了更大的灵活性,并为构造函数和方法启用依赖注入。 ParameterResolver定义了测试扩展的API,希望在运行时动态解析参数。如果测试构造函数或@Test, @TestFactory, @BeforeE

  • 我需要重构现有的抽象类来实现依赖注入,但是这个类有两个接受其他参数的构造函数。 我需要注入一些接口,并避免在构造函数中传递任何其他参数,如“settingsId”和“Setting”。所以我的想法是在创建此类的实例后创建两种方法来设置这些参数。 但它看起来不是一个合适的解决方案,因为如果开发人员忘记在创建实例后运行这些方法之一,我们将来可能会得到一个异常(对象未设置为引用...)。我应该如何正确执

  • 问题内容: 我发现我的构造函数开始看起来像这样: 不断增加的参数列表。由于“容器”是我的依赖项注入容器,所以为什么我不能这样做: 每堂课?不利之处是什么?如果执行此操作,则感觉就像我在使用精美的静态方法。请分享你对IoC和依赖注入疯狂的想法。 问题答案: 正确的是,如果将容器用作服务定位器,则它或多或少是光荣的静态工厂。由于种种原因,我认为这是一种反模式。 构造函数注入的奇妙好处之一是,它使违反单