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

ASP。使用多个构造函数的NET Core依赖项注入

盖嘉珍
2023-03-14

在我的ASP. NET Core应用程序中,我有一个具有多个构造函数的标记助手。当ASP. NET 5尝试解析类型时,这会在运行时导致以下错误:

在类型'MyNameSpace中发现了多个接受所有给定参数类型的构造函数。MyTagHelper'.应该只有一个适用的构造函数。

其中一个构造函数是无参数的,另一个有一些参数不是注册类型的参数。我希望它使用无参数构造函数。

有没有办法让ASP. NET 5依赖注入框架选择特定的构造函数?通常这是通过使用属性来完成的,但是我找不到任何东西。

我的用例是,我试图创建一个类,它既是TagHelper,又是HTML helper,如果这个问题得到解决,这是完全可能的。

共有3个答案

蒙华翰
2023-03-14

对于无参数构造函数,其他答案仍然是正确的,也就是说,如果你有一个类有一个无参数构造函数和一个带参数的构造函数,那么问题中的异常将被抛出。

如果有两个带参数的构造函数,则行为是使用已知参数的第一个匹配构造函数。您可以在这里查看ConstructorMatcher类的源代码以了解详细信息。

董新觉
2023-03-14

Illya是对的:内置解析器不支持暴露多个构造函数的类型。。。但是,没有什么可以阻止您注册代理以支持此场景:

services.AddScoped<IService>(provider => {
    var dependency = provider.GetRequiredService<IDependency>();

    // You can select the constructor you want here.
    return new Service(dependency, "my string parameter");
});

注:如其他答案所示,在更高版本中添加了对多个构造函数的支持。现在,DI堆栈将愉快地选择它能解析的参数最多的构造函数。例如,如果你有两个构造函数——一个有3个参数指向服务,另一个有4个参数——它会更喜欢有4个参数的构造函数。

夏侯臻
2023-03-14

ActivatorUtilitiesConstructorAttribute应用于要由DI使用的构造函数:

[ActivatorUtilitiesConstructor]
public MyClass(ICustomDependency d)
{
}

这需要使用ActivatorUtilities类来创建MyClass。截至。NET Core 3.1 Microsoft依赖项注入框架在内部使用ActivatorUtilities;在旧版本中,您需要手动使用它:

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

  • 问题内容: 我有下面的构造函数的文本编辑器类 在春豆中,我有 我观察到的是带有两个参数的构造函数,称为一致。它是随机的吗?是否应该不抛出弹簧异常,因为它不知道需要调用哪个构造函数? 问题答案: 这是Spring自动装配构造函数的结果。 它要做的第一件事是获取所有bean类的构造函数并对它们进行排序,首先将公共构造函数的参数数量减少,然后再将所有非公共构造函数的参数数量减少。这些是候选构造函数。 然

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

  • 我正在使用spring官方教程中的示例进行实验,并且对此代码有一个依赖关系: https://github.com/spring-guides/gs-async-method/tree/master/complete 如果您查看类上的代码,我有两个问题: 当服务器启动时,如果我在这个类的构造函数中放置一个断点,就像在构造函数中一样,是由spring使用配置的bean提供的。但是,构造函数上没有注释

  • 我正试图在计算机上实现这个例子https://developer.android.com/jetpack/docs/guide.这就解释了Android应用程序的结构。 当我使用相同的代码时,我会出现以下错误。 我可以找出这个错误与 当我为ViewModel编写默认的零输入构造函数时,我得到了以下错误。 我想不出这个错误的原因和解决方法。

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