zoukankan      html  css  js  c++  java
  • .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);   }
  • 相关阅读:
    401. Binary Watch
    46. Permutations
    61. Rotate List
    142. Linked List Cycle II
    86. Partition List
    234. Palindrome Linked List
    19. Remove Nth Node From End of List
    141. Linked List Cycle
    524. Longest Word in Dictionary through Deleting
    android ListView详解
  • 原文地址:https://www.cnblogs.com/xwc1996/p/13603636.html
Copyright © 2011-2022 走看看