内存配置方式
上节介绍配置框架时,给出了一段示例代码
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