【问题标题】:.NET Core 2 & DI - use values from appsettings.json in the constructor?.NET Core 2 和 DI - 在构造函数中使用 appsettings.json 中的值?
【发布时间】:2018-05-24 12:02:03
【问题描述】:

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

    如果使用IOptions&lt;T&gt;,则更新Service 构造函数以显式依赖IOptions&lt;MyOptions&gt;,以便将其注入到类中。

    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

    【讨论】:

    • IOptions&lt;T&gt; 是不必要的,因为 OP 使用了services.Configure。这意味着他们现在可以直接注入MyOptions。注入IOptionsSnapshot&lt;T&gt; 有好处,因为它可以让你重新加载功能,但考虑到 OP 正在添加一个临时服务,无论如何,即使这是多余的。
    • @ChrisPratt 这是有道理的。感谢您指出这一点。
    【解决方案2】:

    您正在使用的AddTransient 重载的lambda 参数实际上是IServiceProvider 的一个实例。这意味着您可以简单地这样做:

    services.AddTransient<IService, Service>(p => {
        var options = p.GetRequiredService<MyOptions>();
        return new Service(options.arg1, options.arg2);
    });
    

    【讨论】:

      【解决方案3】:

      您可以使用框架 IConfiguration 接口从 appsettings.json 获取值。

      假设你的 json 是

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

      然后像这样读取值

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-21
        • 2022-06-29
        • 1970-01-01
        • 2018-05-30
        相关资源
        最近更新 更多