C# .NET核心2&;DI-在构造函数中使用appsettings.json中的值?
如何使用构造函数参数,其值存储在C# .NET核心2&;DI-在构造函数中使用appsettings.json中的值?,c#,asp.net-core,asp.net-core-2.0,C#,Asp.net Core,Asp.net Core 2.0,如何使用构造函数参数,其值存储在appsettings.json中 services.AddTransient<IService, Service>(x => new Service("arg1", "arg2")); 您可以通过框架IConfiguration接口从appsettings.json获取值 假设您的json是 { "argSection": { "arg1": 1, "arg2": 2 } } 然后像这样读
appsettings.json
中
services.AddTransient<IService, Service>(x => new Service("arg1", "arg2"));
您可以通过框架IConfiguration接口从appsettings.json获取值 假设您的json是
{
"argSection":
{
"arg1": 1,
"arg2": 2
}
}
然后像这样读取值
services.AddTransient<IService, Service>(x => new Service(Configuration["argSection:arg1"], Configuration["argSection:arg2"]));
services.AddTransient(x=>新服务(配置[“argSection:arg1”]、配置[“argSection:arg2”]);
如果使用IOptions
则更新Service
构造函数以明确依赖IOptions
,以便将其注入类中
public class Service: IService {
public Service(IOptions<MyOptions> options) {
this.arg1 = options.Value.arg1;
this.arg2 = options.Value.arg2;
}
}
若无法更改服务类构造函数,则在对象工厂委托中解析选项
services.AddTransient<IService, Service>(serviceProvider => {
var options = serviceProvider.GetService<IOptions<MyOptions>>();
return new Service(options.Value.arg1, options.Value.arg2);
});
services.AddTransient(serviceProvider=>{
var options=serviceProvider.GetService();
返回新服务(options.Value.arg1、options.Value.arg2);
});
Reference您正在使用的
AddTransient
重载的lambda中的参数实际上是IServiceProvider
的一个实例。这意味着您可以简单地执行以下操作:
services.AddTransient<IService, Service>(p => {
var options = p.GetRequiredService<MyOptions>();
return new Service(options.arg1, options.arg2);
});
services.AddTransient(p=>{
var options=p.GetRequiredService();
返回新服务(options.arg1、options.arg2);
});
IOptions
是不必要的,因为OP使用了服务。配置。这意味着他们现在可以直接注入MyOptions
。注入IOptionsSnapshot
有好处,因为这会让您重新加载功能,但考虑到OP正在添加临时服务,无论如何,即使这样也是多余的。@ChrisPratt这是有道理的。谢谢你指出这一点。
{
"MyOptions": {
"arg1": value1,
"arg2": value2
}
}
services.AddTransient<IService, Service>(serviceProvider => {
var options = serviceProvider.GetService<IOptions<MyOptions>>();
return new Service(options.Value.arg1, options.Value.arg2);
});
services.AddTransient<IService, Service>(p => {
var options = p.GetRequiredService<MyOptions>();
return new Service(options.arg1, options.arg2);
});