代码之家  ›  专栏  ›  技术社区  ›  Tony

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

  •  3
  • Tony  · 技术社区  · 8 年前

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

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

    我使用 IOptions 用于读取我的配置值的接口

    services.Configure<MyOptions>(Configuration.GetSection(nameof(MyOptions)));
    
    3 回复  |  直到 8 年前
        1
  •  6
  •   Nkosi    8 年前

    如果使用 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

        2
  •  2
  •   Chris Pratt    8 年前

    lambda中用于重载的参数 AddTransient 您使用的实际上是 IServiceProvider 。这意味着您可以简单地执行以下操作:

    services.AddTransient<IService, Service>(p => {
        var options = p.GetRequiredService<MyOptions>();
        return new Service(options.arg1, options.arg2);
    });
    
        3
  •  1
  •   Marcus Höglund    8 年前

    您可以从appsettings获取值。带有框架IConfiguration接口的json。

    假设您的json是

    {
       "argSection": 
        {
           "arg1": 1,
           "arg2": 2
        }
    }
    

    然后读取如下值

    services.AddTransient<IService, Service>(x => new Service(Configuration["argSection:arg1"], Configuration["argSection:arg2"]));