zoukankan      html  css  js  c++  java
  • 跟我一起学.NetCore之配置初体验

    前言

        配置对于程序来说,绝对是必不可少,毕竟配置是应用或组件动态适应各种环境的最优方案,没有之一(我还年轻,我是这么认为的);之前可能用的最多的配置源是命令行、文件(XML、Json、INI),Web中对于Asp.Net程序员Web.Config是接触的再多不过了,不管怎样,读取配置信息是避免不了啦,但是对于各种配置源不同及格式不同,又得专门开发对应的配置解析程序;不慌,.NetCore内置的配置框架为此一解烦恼,开箱即用,正文详解,走起~~~

    正文

        体验之前,简单聊聊有关配置的几个核心类型及其对应的联系;

    • IConfiguration:暴露给我们使用的配置对象,其实是底层将不同数据结构的原始数据提取,并进行封装成一个具有树形化层次结构的IConfiguration对象;根节点和其他配置节点都继承IConfiguration;

      namespace Microsoft.Extensions.Configuration
      {
          public interface IConfiguration
          {
              // 索引访问    
              string this[string key] { get; set; }
              // 指定Key获取 配置节点        
              IConfigurationSection GetSection(string key);
               // 配置子节点          
              IEnumerable<IConfigurationSection> GetChildren();
              // 用于配置变化通知使用        
              IChangeToken GetReloadToken();
          }
      }

              IConfigurationRoot:根节点,配置的根;

    namespace Microsoft.Extensions.Configuration
    {
        public interface IConfigurationRoot : IConfiguration
        {
            // 对配置数据的重新加载,因为是根,所以会重新加载全部数据
            void Reload();
            // 用于不同配置源获取获取数据
            IEnumerable<IConfigurationProvider> Providers { get; }
        }
    }

         IConfigurationSection:其他配置节点,可以理解为子节点; 

    namespace Microsoft.Extensions.Configuration
    {
        public interface IConfigurationSection : IConfiguration
        {
            // 数据指定Key值
            string Key { get; }
            // 逻辑树的路径,层次用冒号:隔开,如SectionA:SectionB
            string Path { get; }
            // 承载的配置数据
            string Value { get; set; }
        }
    }

    关系图如下:

    • IConfigurationProvider:真正读取原始配置的数据,并将其转换一个中间字典的结构,最后再封装成IConfiguration;

      namespace Microsoft.Extensions.Configuration
      {
          public interface IConfigurationProvider
          {   // 获取指定Key的值
              bool TryGet(string key, out string value);
              // 设置对应Key值
              void Set(string key, string value);
      ​
              IChangeToken GetReloadToken();
              // 加载配置数据
              void Load();
              // 获取指定配置节点所有子节点Key
              IEnumerable<string> GetChildKeys(IEnumerable<string> earlierKeys, string parentPath);
          }
      }
    • IConfigurationSource:原始配置源的体现,每种配置源都会有一个实现该接口的实现类,由于真正读取配置数据是委托IConfigurationProvider对象进行读取的,所以IConfigurationSource的作用就是为了提供IConfigurationProvider对象;

      namespace Microsoft.Extensions.Configuration
      {
          public interface IConfigurationSource
          {
              // 提供对应的 IConfigurationProvider对象
              IConfigurationProvider Build(IConfigurationBuilder builder);
          }
      }
    • IConfigurationBuilder:将IConfigurationSource配置源注册进行,通过调用其Build方法构造出IConfiguration;

      namespace Microsoft.Extensions.Configuration
      {
          public interface IConfigurationBuilder
          {
              IDictionary<string, object> Properties { get; }
              // 保存所有注册进来的 配置源        
              IList<IConfigurationSource> Sources { get; }
              // 注册配置源        
              IConfigurationBuilder Add(IConfigurationSource source);
              // 构造出一个Root对象,然后通过root对象就能获取section,并获取对应上面的值        
              IConfigurationRoot Build();
          }
      }

       核心对象关系总结:

    1. IConfigurationProvider真正读取配置数据,并将其封装为中间字典;

    2. 同的配置源IConfigurationSource提供对应的IConfigurationProvider对象;

    3. 通过IConfigurationBuilder将不同的IConfigurationSource配置源进行注册,并创建出对应的IConfiguration对象;

    4. 通过创建的IConfiguration对象就可以获取指定节点的值;

        核心类型及其关系就简单说这么多,接下来对不同配置源进行使用体验一把,接下来用一个控制台程序进行演示,老规矩,先通过Nuget安装核心包:

        开始撸代码:

    • 内存配置源

         运行结果:

    • 命令行配置源

      命令行支持的格式

      A. 无前缀的 key=value模式

      B. 双中横线模式 --key=value或 --key value

      C. 正斜杠模式 /key=value或 /key value

    开撸:

    增加命令行扩展包:

    模拟命令行传参,两种方式:

    项目属性里面配置

            直接在launchSettings.json中配置

           代码   

            运行结果

    • 文件配置源

      通过Nuget安装对应文件类型的包,如下

      准备xml、json、ini三个配置源不同的文件

      代码应用

      运行,正常获取值

    • 环境变量配置源

           在之前,估计想不到合适的应用场景将环境变量作为配置源,对不对,如果有,那应该不多;但是现如今docker的存在,让其变得常用,因为毕竟容器的隔离使得环境变量可以针对对应的容器进行配置;

        通过Nuget安装包

        模拟环境变量配置

        代码走起

        运行结果

       

    总结

        这里先写到这吧,太晚了,今天大概说了几个关键类型的作用及关系,然后针对不同配置源进行举例演示,用法基本上都是这样,是不是很简单;下次咱们聊聊热更新;

  • 相关阅读:
    C#中Excel的导入和导出的几种基本方式
    关于XML与类型Class的映射
    关于模板的相关注意事项
    OGRE 2.1 Windows 编译
    R6010 -abort() has been called
    VS2012 编译 Assimp
    C++ 并发消息队列
    Debian 安装下载工具软件
    Oracle SQL语句追踪
    记录自己学习网址
  • 原文地址:https://www.cnblogs.com/zoe-zyq/p/13433262.html
Copyright © 2011-2022 走看看