使用构造函数的 DI 不起作用,因为对象需要参数较少的构造函数

DI using constructor not works because object required parameter less constructor

有一个 class 使用一些来自构造函数的依赖项。

public class FooHttpApiHostModule : AbpModule
{
    private readonly ICustomContext _customContext;

    public FooHttpApiHostModule(ICustomContext customContext)
    {
        _customContext = customContext;
    }

    // Some other code here.
}

ApplicationModule里面,添加了一个作用域。

public class FooApplicationModule : AbpModule
{
    public override void ConfigureServices(ServiceConfigurationContext context)
    {
        context.Services
            .AddScoped<ICustomContext, CustomContext>();
    }
}

但是当代码为运行时,下一个异常发生:

System.MissingMethodException: Cannot dynamically create an instance of type FooHttpApiHostModule.
Reason: No parameterless constructor defined.

异常发生在下一行的 Startup class 中。

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddApplication<FooHttpApiHostModule>(); // <-- Exception on this line.
    }
}

有没有其他方法可以将ICustomContext注入FooHttpApiHostModule


更新 1:

在我的 FooHttpApiHostModule

ConfigureServices 中写下这一行时
var graphContext = context.Services.GetRequiredService<ICustomContext>();

发生下一个错误

System.ArgumentNullException: Value cannot be null.
(Parameter provider)

完整代码:

public class FooHttpApiHostModule : AbpModule
{
    // Removed constructor and private readonly variable.

    public override void ConfigureServices(ServiceConfigurationContext context)
    {
        ICustomContext customContext = context.Services.GetRequiredService<ICustomContext>(); // <-- exception on this line.
    }

    // Other code here...
}

进行了额外检查,ICustomContext 被添加到范围中。

您不能像 FooHttpApiHostModule 那样使用构造函数注入。

相反,您应该使用如下代码:

public class FooHttpApiHostModule : AbpModule
{

     public override void ConfigureServices(ServiceConfigurationContext context)
     {
        var customContext = context.Services.GetRequiredService<ICustomContext>()
        // customContext.Do();
        // Some other code here.
     }
}

参考:

  1. https://docs.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection?view=aspnetcore-6.0#resolve-a-service-at-app-start-up