Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .NET核心2&;DI-在构造函数中使用appsettings.json中的值?_C#_Asp.net Core_Asp.net Core 2.0 - Fatal编程技术网

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