如何使用构造函数参数,其值存储在appsettings.json
?
services.AddTransient<IService, Service>(x => new Service("arg1", "arg2"));
我使用IOptions
界面来读取我的配置值
services.Configure<MyOptions>(Configuration.GetSection(nameof(MyOptions)));
答案 0 :(得分:6)
如果使用IOptions<T>
,则更新Service
构造函数以明确依赖IOptions<MyOptions>
,以便将其注入到类中。
public class Service: IService {
public Service(IOptions<MyOptions> options) {
this.arg1 = options.Value.arg1;
this.arg2 = options.Value.arg2;
}
}
配置可以简化为
services.Configure<MyOptions>(Configuration.GetSection(nameof(MyOptions)));
services.AddTransient<IService, Service>();
假设 appsettings.json 包含
{
"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);
});
答案 1 :(得分:2)
您正在使用的AddTransient
重载的lambda中的参数实际上是IServiceProvider
的实例。这意味着你可以做到:
services.AddTransient<IService, Service>(p => {
var options = p.GetRequiredService<MyOptions>();
return new Service(options.arg1, options.arg2);
});
答案 2 :(得分:1)
您可以使用框架IConfiguration接口从appsettings.json获取值。
让我们说你的json是
{
"argSection":
{
"arg1": 1,
"arg2": 2
}
}
然后读取像这样的值
services.AddTransient<IService, Service>(x => new Service(Configuration["argSection:arg1"], Configuration["argSection:arg2"]));