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);   }
  • 相关阅读:
    Python-按指定列排序、斜着遍历
    牛客-SQL-刷题(下)
    特征工程之离散变量处理
    python 原生列表删除元素方法总结
    sklearn进行归一化
    Keras安装与测试遇到的坑
    常用机器学习算法优缺点及应用汇总
    特征工程
    机器学习模型评估指标总结
    pyecharts多图表同一页显示
  • 原文地址:https://www.cnblogs.com/xwc1996/p/13603636.html
Copyright © 2011-2022 走看看