• .Net Core之Configuration


    ASP.NET CORE 中自动集成了应用配置,支持从以下 源 处获取配置键值对

    • 命令行
    • 环境变量
    • 内存
    • 文件配置

    其中文件配置是我们最常用的方式,默认文件是.json的json格式文件,摒弃了以往.config的xml的文件格式。

    应用配置有以下几个约定:

    • 键不区分大小写,如果存在相同的键,则取最后一个值
    • 分层键 : 取子节点。或者__双下划线
    • 值默认为字符串
    • 不存储NULL值

    那么

    问:配置文件是如何加载的呢?

    答:默认加载appsettings.json,如果有自定义的文件需要加载,则需要在WEBHOST初始化时添加文件路径。

            public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
                WebHost.CreateDefaultBuilder(args)
                    .ConfigureAppConfiguration((context, config) =>
                    {
                        //config.SetBasePath(Directory.GetCurrentDirectory());//如果iis调试,请注释
                        config.AddJsonFile("appsettings_ext.json", optional: false, reloadOnChange: false);
                    })
                    .UseStartup<Startup>();
    

    问:如果获取配置文件内容

    答:IConfiguration。支持在任何地方注入。并有以下几个主要获取Value的方法

    配置文件示例:

      "one": "1",
      "two": { "_two": "2" },
      "fourToSeven": [ "4", "5", "6", "7" ],
      "People": {
        "Name": "gt",
        "Male": "1"
      },
      "Books": [
        { "Name": "语文" },
        { "Name": "数学" }
      ]
    

    取值方式

    //直接获取键值对的Value
     _configuration.GetValue<string>("one");
    
    //获取子节点的Value,使用约定:
    _configuration.GetValue<string>("two:_two");
    //或者获取section的子节点,再去获取Value
    _configuration.GetSection("two").GetChildren().First(x => string.Equals("_two", x.Key,       StringComparison.CurrentCultureIgnoreCase));
    
    
    //获取数组的方式,本质是一个
    _configuration.GetSection("fourToSeven").Get<string[]>();
    

    问:实际应用中我们通常使用类对象来表示配置,.NET CORE里面是如何绑定到类的

    答:.NET CORE提供了Bind方法来将配置绑定到类,另外还提供了Options方式来实现

                //获取Section绑定到对象类,注意对象类的属性值要和配置中一致
                var user = new People();
                _configuration.GetSection("People").Bind(user);
                _people = user;
    
                //也可以采用万能的Get方式,更为简洁
                _configuration.GetSection("people").Get<People>();
    
                public class People
                {
                     public string Name { get; set; }
                     public int Male { get; set; }
                }
    

      Options方式应该是我们日常应用中常用的方式,毕竟IConfiguration需要在使用的地方注入,且需要知道KEY,这就形成了硬编码模式。

    我们先定义一个Options,

        public class BookOptions
        {
            public string Name { get; set; }
        }
    

      那么我们可以在Startup类的ConfigureServices中进行 配置。

        services.Configure<List<BookOptions>>(Configuration.GetSection("books"));
        //这种方式可以给配置项目一个名称,获取的时候根据名称获取
        services.Configure<List<BookOptions>>("myname",Configuration.GetSection("books"));
    

      使用Options也是通过注入的方式使用(万恶的.NET CORE,无处不在注入)。.NET CORE使用 IOptionsMonitor<T>注入的方式,同时其也控制着Options生命周期 。

            private readonly List<BookOptions> _books;
    private readonly List<BookOptions> _booksNamed;

    public ConfigController(IConfiguration configuration, IOptionsMonitor<List<BookOptions>> bookAccessor, IOptionsSnapshot<List<BookOptions>> bookNamedAccessor) { _configuration = configuration; _books = bookAccessor.CurrentValue; _booksNamed = bookNamedAccessor.Value; }

      IOptionsSnapshot<TOptions> 支持包含最小处理开销的重新加载选项。针对请求生存期访问和缓存选项时,每个请求只能计算一次选项。

    .NET CORE配置使用大抵如此,当然实际应用中可能会更复杂点,其也提供了很多扩展方法。

  • 相关阅读:
    数据结构——单链表(singly linked list)
    Java——判断回文
    C——swap
    Java动态数组
    mui框架下监听返回按钮
    Ubuntu 18.04版本下安装网易云音乐
    Linux安装Broadcom无线驱动
    EFI环境下的Ubuntu&Win10双系统安装
    Leaflet中添加的不同图层样式图标
    数据插入数据库时,提示表名不存在
  • 原文地址:https://www.cnblogs.com/gt1987/p/10741315.html
Copyright © 2020-2023  润新知