核心组件包

  • Microsoft.Extensions.Configuration.Abstractions
  • Microsoft.Extensions.Configuration

配置框架

  • **key-value**字符串键值对的方式抽象了配置
  • 支持从不同的数据源读取配置
    • 命令行、环境变量、文件

配置框架核心类型

  • IConfiguration
  • IConfigurationRoot
    • 表示我们的配置的根
  • IConfigurationSection
    • Section作用是指,当我们的配置不是简单的key-value的shi’hou,比如把配置分组
  • IConfigruationBuilder
    • 构建配置的核心,我们所有的设置都是在build中完成

配置框架扩展点

注入我们自己的配置源,也就是说我们可以指定任意的配置的数据来源

  • IConfigurationSource
  • IConfigurationProvider

示例

新建控制台应用程序

  1. using Microsoft.Extensions.Configuration;
  2. using System;
  3. using System.Collections.Generic;
  4. namespace ConfigurationDemo
  5. {
  6. class Program
  7. {
  8. static void Main(string[] args)
  9. {
  10. // 使用默认的ConfigurationBuilder的实现
  11. IConfigurationBuilder builder = new ConfigurationBuilder();
  12. // 注入一个内存的配置数据源,键值对形式
  13. builder.AddInMemoryCollection(new Dictionary<string, string>
  14. {
  15. { "key1","value1"},
  16. { "key2","value2"}
  17. });
  18. // 使用Build把所有的配置构建出来,并且获得一个configurationRoot
  19. // configurationRoot就表示我们的配置的根,也就是说我们读取配置的动作
  20. // 都是需要从IConfigurationRoot这个对象读取的
  21. IConfigurationRoot configurationRoot = builder.Build();
  22. // 读取key1和key2
  23. Console.WriteLine(configurationRoot["key1"]);
  24. Console.WriteLine(configurationRoot["key2"]);
  25. }
  26. }
  27. }

image.png
使用默认的ConfigurationBuilder获取IConfigurationBuilder的实例
将一个字典集合注入一个内存配置源
使用IConfigurationBuilder.Build()将配置构建出来,获取IConfigurationRoot对象
根据IConfigurationRoot获取配置内容

当我们的程序不仅仅是简单的key-value的时候,例如分组

  1. using Microsoft.Extensions.Configuration;
  2. using System;
  3. using System.Collections.Generic;
  4. namespace ConfigurationDemo
  5. {
  6. class Program
  7. {
  8. static void Main(string[] args)
  9. {
  10. // 使用默认的ConfigurationBuilder的实现
  11. IConfigurationBuilder builder = new ConfigurationBuilder();
  12. // 注入一个内存的配置数据源,键值对形式
  13. builder.AddInMemoryCollection(new Dictionary<string, string>
  14. {
  15. { "key1","value1"},
  16. { "key2","value2"},
  17. // section每一节使用冒号来作为节的分隔符的
  18. { "section1:key1","section2.value1"},
  19. { "section2:key1","section2.value1"},
  20. { "section2:key2","section2.value2"}
  21. });
  22. // 使用Build把所有的配置构建出来,并且获得一个configurationRoot
  23. // configurationRoot就表示我们的配置的根,也就是说我们读取配置的动作
  24. // 都是需要从IConfigurationRoot这个对象读取的
  25. IConfigurationRoot configurationRoot = builder.Build();
  26. // 读取key1和key2
  27. //Console.WriteLine(configurationRoot["key1"]);
  28. //Console.WriteLine(configurationRoot["key2"]);
  29. // 获取一个section
  30. IConfigurationSection configurationSection = configurationRoot.GetSection("section2");
  31. Console.WriteLine(configurationSection["key1"]);
  32. Console.WriteLine(configurationSection["key2"]);
  33. }
  34. }
  35. }

image.png
**section**每一节使用冒号来作为节的分隔符的
通过IConfigurationRoot.GetSection()获取一个Section
使用IConfigurationSection获取配置内容

也可以使用套娃来实现多节分组
在字典集合中添加:{ "section2:section3:key1","section2.section3.value1"}
使用configurationRoot.GetSection("section2").GetSection("section3");获取