总的逻辑

  1. 继承 IConfigurationSource 这个接口的子类是配置源 ,其中的build方法,创建并返回对应的ConfigurationProvider。
  2. 继承 IConfigurationProvider 这个接口的子类是负责加载/返回配置的,其中的Load方法负责真正的加载配置,TryGet方法获得调用者期望的配置。

再具体的话,大的逻辑是这样的

// 1 添加配置源source ,结果保存在IConfigurationBuilder的成员
// IList<IConfigurationSource> Sources { get; } 中
IConfigurationBuilder.Add(IConfigurationSource source) // 2 加载配置
var configurationRoot = IConfigurationBuilder.Build()
// 2.1 循环Sources,调用**IConfigurationSource.Build**(IConfigurationBuilder builder) ,
//该方法返回 xxxxConfigurationSource 对应的 xxxxConfigurationProvider, 并将返回值保存在临时变量List<IConfigurationProvider>providers中
//2.2 将变量 providers 传递给 ConfigurationRoot 对象 ,**new ConfigurationRoot(providers)**,
//ConfigurationRoot的构造函数,里面的逻辑是循环 providers ,调用IConfigurationProvider.Load()
//将配置的具体内容加载到 ** provider 对象中的 IDictionary<string, string> Data **; // 3 获取想要的值
string value1= configurationRoot["key1"],
//具体实现是倒序循环providers,调用**IConfigurationProvider.TryGet()**获取值;
//为什么是倒序循环,这样如果不同的配置源包含相同的Key,后面添加的会优先后面添加的配置源中的值

举例 ,加载命令行配置

 var args = new string[]
{
"Key1=Value1",
"Key2=Value2",
};
// 创建ConfigurationBuilder实例
var builder = new ConfigurationBuilder();
//1 添加配置源, 实际上IConfigurationBuilder有很多扩展方法,可以更方便的添加配置
builder.AddCommandLine(args);
//2 开始加载配置
var configurationRoot = builder.Build();
//3 使用配置
Console.WriteLine($"Key1:{configurationRoot["Key1"]}");

根据最上面的加载配置的逻辑 ,上面的这个例子的内部核心是这样的

var args = new string[]
{
"Key1=Value1",
"Key2=Value2",
};
//设置配置源
var cmdLineConfig = new CommandLineConfigurationProvider(args);
//加载配置源
cmdLineConfig.Load();
//使用配置
Console.WriteLine($"Key1:{cmdLineConfig.Get("Key1")}");

最新文章

  1. 1.ios synthesize有什么作用
  2. JVM之Class文件结构
  3. [vim] vim入门
  4. [改善Java代码]多线程使用Vector或HashTable
  5. jquery的效果地址
  6. Unity3d BTDF实时折射模拟有粗糙度的半透明物体
  7. JavaEE学习笔记---数据库操作篇
  8. JQUERY简写案例
  9. react 各种UI框架
  10. java9学习之模块化
  11. java中的抽象类的作用
  12. Email发展历史
  13. spring_01概念及案例
  14. iris数据集(鸢尾花)
  15. Jenkins之定时任务
  16. ELK实战(Springboot日志输出查找)
  17. Ubuntu 12.04 Openstack Essex 安装(单节点)
  18. c基础_笔记_1
  19. os._exit(), sys.exit(), exit()
  20. 微信小程序“信用卡还款”项目实践

热门文章

  1. 乐维监控与Zabbix对比分析(一)——架构、性能
  2. 零基础学习python的第一天整理——python的安装以及pycharm安装
  3. 【Java框架】SSM-Spring总结:IOC、DI、AOP、JDBC、事务管理、实际案例
  4. 【SQL基础】多表查询:子查询、连接查询(JOIN)、组合查询(UNION集合运算)
  5. 痞子衡嵌入式:国内外串行NOR Flash厂商官网Cross Reference功能使用体验
  6. Redis——02 学习
  7. 10、比较Bigdecimal类型是否相等的方法
  8. Nodejs报错记录
  9. python进阶之路4基本运算符、格式化输出
  10. Maui 读取外部文件显示到Blazor中