.Net Core使用Options模式来使用配置项

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中如下代码:

复制代码
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); });
复制代码

运行可以看到输出结果。输出的结果会随这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);   }

 

posted @ 2020-09-02 20:55  以往清泉  阅读(553)  评论(0编辑  收藏  举报
//替换成自己路径的js文件