内存配置方式
上节介绍配置框架时,给出了一段示例代码
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"]}");
其实,这里使用的
configurationBuilder.AddInMemoryCollection();
即使内存配置的方式,因此这里主要说下命令行配置方式
命令行配置方式
支持的命令格式
- 无前缀的 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