那么,我们先来了解一下配置框架的基本信息。
核心组件包
- Microsoft.Extensions.Configuration.Abstractions(抽象包)
- Microsoft.Extensions.Configuration(实现包)
配置框架
- 以key-value字符串键值对的方式抽象了配置
- 支持从各种不同的数据源读取配置
配置框架核心类型
对配置的操作要依赖以下类型
- IConfiguration
- IConfigurationBuilder
- IConfigurationRoot
- IConfigurationSection
配置框架扩展点
框架扩展点主要用于自定义扩展,可用于实现自定义配置框架
- IConfigurationSource
- IConfigurationProvider
配置框架的种类
- 内存配置
- 命令行配置
- 环境变量配置
- 文件提供程序配置
4种配置框架详解
内存配置
configurationBuilder.AddInMemoryCollection();
这个比较简单,我们看下具体代码
IConfigurationBuilder configurationBuilder = new ConfigurationBuilder(); configurationBuilder.AddInMemoryCollection( new Dictionary<string, string>() { {"key1","value1" }, {"key2","value2" }, {"section1:key3","value3" }, {"section2:section3:key4","value4" } } ); IConfigurationRoot configurationRoot = configurationBuilder.Build(); Console.WriteLine($"key1:{configurationRoot["key1"]}"); Console.WriteLine($"key2:{configurationRoot["key2"]}"); Console.WriteLine($"key3:{configurationRoot["section1:key3"]}"); IConfigurationSection section1 = configurationRoot.GetSection("section1"); Console.WriteLine($"section1_key3:{section1["key3"]}"); IConfigurationSection section3 = configurationRoot.GetSection("section2:section3"); Console.WriteLine($"section2_section3_key4:{section3["key4"]}");
内存配置方式,是最基本的配置方式,从这个方式,我们可以理解一下上述提到的几个核心类型。
- 配置的构建都通过IConfigurationBuilder来完成
- 配置通过Builder创建,得到一个配置根IConfigurationRoot
- “:”我们称为节,获取节通过GetSection得到IConfigurationSection
这里注意以下几点
- 获取section内的值,可以直接通过section:key的完整方式获取
Console.WriteLine($"key3:{configurationRoot["section1:key3"]}");
- 后面讲到环境变量配置方式时,其中可用"__"来代替“:”,注意该方式只适用于环境变量配置方式,其他方式不适用。
命令行配置
支持的命令格式
- 无前缀的 key=value 模式
- 双中横线模式 --key=value --key value
- 正斜杠模式 /key=value /key value
- 备注:使用无前缀模式时,必须使用=,其他2种模式才可使用空格分隔符
引用包
- Microsoft.Extensions.Configuration.Abstractions
- Microsoft.Extensions.Configuration
- Microsoft.Extensions.Configuration.CommandLine
代码演示
在调试命令行配置时,我们可以右键项目,在弹出的属性窗口,选择调试项目,在命令行参数栏填写我们的命令,如
或,通过lanchSettings.json文件进行编辑
{ "profiles": { "06_Configuration_CommandLine": { "commandName": "Project", "commandLineArgs": "cmd1=value1 /cmd2=value2 /cmd3 value3 --cmd4=value4 --cmd5 value5 --cmd6:cmd6 value6" // --k1 value1_new -k2 value2_new } } }
准备好这些后,我们可以通过以下命令启用命令行配置。
configurationBuilder.AddCommandLine(args);
具体代码如下所示
IConfigurationBuilder configurationBuilder = new ConfigurationBuilder(); configurationBuilder.AddCommandLine(args); IConfigurationRoot configurationRoot = configurationBuilder.Build(); Console.WriteLine($"cmd1:{configurationRoot["cmd1"]}"); Console.WriteLine($"cmd2:{configurationRoot["cmd2"]}"); Console.WriteLine($"cmd3:{configurationRoot["cmd3"]}"); Console.WriteLine($"cmd4:{configurationRoot["cmd4"]}"); Console.WriteLine($"cmd5:{configurationRoot["cmd5"]}"); Console.WriteLine($"cmd6_cmd6:{configurationRoot["cmd6:cmd6"]}"); IConfigurationSection configurationSection = configurationRoot.GetSection("cmd6"); Console.WriteLine($"cmd6:{configurationSection["cmd6"]}");
命令替换
除了常规的配置方式外,命令行配置还提供了命令替换功能,我们可以定义一个mapper来存储需要被替换的命令,这样,如果在参数中配置了该替换值的值,那么被替换键的值将被替换。命令替换通常通过“-”或“--”来标识。
var mapper = new Dictionary<string, string>() { { "--k1", "cmd1" }, { "-k2", "cmd2" } }; configurationBuilder.AddCommandLine(args, mapper); IConfigurationRoot configurationRoot = configurationBuilder.Build(); Console.WriteLine($"--key1:{configurationRoot["--k1"]}"); Console.WriteLine($"key1:{configurationRoot["cmd1"]}"); Console.WriteLine($"-key2:{configurationRoot["-k2"]}"); Console.WriteLine($"key2:{configurationRoot["cmd2"]}");
这里需要注意
- 命令替换,类似于起别名,首先要定义字典
- 使用于类似--help用-h代替的场景
- 映射字典不能包含重复key,否则报错
详细代码请参阅
https://github.com/IronMarmot/Samples/tree/master/CoreSamples