• .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);   }
  • 相关阅读:
    Thinkpad R400无线网络一个都不见了!
    如果使用安卓4.4的SD卡?
    如何使用安卓4.4的SD卡?
    在IAR使用FreeRTOS出现Error[Pa045]: function "XXX" has no prototype
    DSP5509的RTC实验-第3篇
    LWM2M简介-学习记录
    DSP5509的定时器实验-第2篇
    DSP5509的XF实验-第一篇
    华为LiteOS系统使用-任务调度函数-第一篇
    2017-12-24自选的股票之春秋航空
  • 原文地址:https://www.cnblogs.com/xwc1996/p/13603636.html
Copyright © 2020-2023  润新知