Options模式使用类来对配置项进行访问,这个类称为选项类。选项类有三个要求:

1.必须是包含无参构造函数的非抽象类。

2.类型的属性名称与配置键名称相同,拥有get和set。

3.使用一个属性包含键名称,不在类绑定配置程序的时候进行硬编码。

我们在appsettings.json中加入以下数据:

"MyKey": {
  "Name": "my name is tom",
    "Age": "my age is 12"
}

然后建立一个选项类MyOptions:

public class MyOptions
{
  public string Name { get; set; }
  public string Age { get; set; }
}

在Starup.cs中如下代码:

.net core 读取 apollo 一直有缓存 .net core options_配置项

app.Run(async context =>
{
    MyOptions myOptions = new MyOptions();
    Configuration.GetSection("MyKey").Bind(myOptions);
  //Configuration.GetSection("MyKey").Get<MyOptions>();
    await context.Response.WriteAsync(myOptions.Name + "," + myOptions.Age);
});

.net core 读取 apollo 一直有缓存 .net core options_配置项

运行可以看到输出结果。输出的结果会随这appsettings.json的配置更改而更改哦

 选项接口

选项有三个接口IOptions、IOptionsSnapshot和IOptionsMonitor。这几个接口可用让Option类通过依赖注入的形式使用。

IOptions不支持再启动后读取配置变动的数据,不支持命名选项。注册为单一实例可以注入到任何服务周期。

IOptionsSnapshot在每次请求时读取配置项已更新的数据,注册为范围内,所以无法注入到单一服务实例。支持命名选项。

IOptionsMonitor支持读取配置项的更新、命名选项。注册为单一实例可以注入到任何服务周期。

它们的使用很简单:

public void ConfigureServices(IServiceCollection services)
        {
            services.Configure<MyOptions>(Configuration.GetSection(MyOptions.Position));
        }
private readonly MyOptions _options;
        public HomeController(IOptions<MyOptions> options)
        {
            _options = options.Value;
        }
private readonly MyOptions _options;
        public HomeController(IOptionsSnapshot<MyOptions> options)
        {
            _options = options.Value;
        }
private readonly IOptionsMonitor<MyOptions> _options;
        public HomeController(IOptionsMonitor<MyOptions> options)
        {
            _options = options;
        }

命名选项

命名选项使用在当多个配置节绑定到同一属性时,并且区分大小写。

如以下的配置项:

"MyKey": {
    "Name": "my name is tom",
    "Age": "my age is 13"
  },
  "MyKey1": {
    "Name": "my name is tom",
    "Age": "my age is 13"
  }

使用下面的类,通过两个属性区分键:

public class MyOptions
    {
        public const string Position = "MyKey";
        public const string Position1 = "MyKey1";
        public string Name { get; set; }
        public string Age { get; set; }
    }

然后配置命名选项:

services.Configure<MyOptions>(MyOptions.Position, Configuration.GetSection(MyOptions.Position));
  services.Configure<MyOptions>(MyOptions.Position1, Configuration.GetSection(MyOptions.Position1));

最后使用命名选项:

private readonly MyOptions _options;
  private readonly MyOptions _options1;
  public HomeController(IOptionsMonitor<MyOptions> options)
  {
    _options = options.Get(MyOptions.Position);
    _options1 = options.Get(MyOptions.Position1);
  }