.NET Core 2& DI - 在构造函数中使用appsettings.json中的值?

时间:2018-05-24 12:02:03

标签: c# asp.net-core asp.net-core-2.0

如何使用构造函数参数,其值存储在appsettings.json

services.AddTransient<IService, Service>(x => new Service("arg1", "arg2"));

我使用IOptions界面来读取我的配置值

services.Configure<MyOptions>(Configuration.GetSection(nameof(MyOptions)));

3 个答案:

答案 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);
});

参考Options pattern in ASP.NET Core

答案 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"]));