使用构造函数的 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.
}
}
参考:
有一个 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 typeFooHttpApiHostModule
.
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.
(Parameterprovider
)
完整代码:
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.
}
}
参考: