如何通过命令行短开关覆盖嵌套的appsettings配置
解决方案
1. 修正SwitchMappings的映射路径
命令行配置系统使用**冒号:**表示嵌套配置的层级关系,而非环境变量采用的双下划线__。只需将映射值改为冒号分隔的路径即可:
source.SwitchMappings = new Dictionary<string, string>() { { "-i", "FileReader:InputDirectory" } };
2. 确保配置源的优先级顺序
配置源的添加顺序决定优先级,后添加的源会覆盖先添加的源的值。你的代码中已将AddCommandLine放在JSON文件和环境变量之后,这个顺序是正确的。如果想简化代码,也可以直接修改Host.CreateDefaultBuilder默认添加的命令行配置源,无需重复添加:
IHost host = Host.CreateDefaultBuilder(args) .ConfigureAppConfiguration((context, builder) => { // 找到默认的命令行配置源并修改映射 var cmdLineSource = builder.Sources.OfType<CommandLineConfigurationSource>().FirstOrDefault(); if (cmdLineSource != null) { cmdLineSource.SwitchMappings = new Dictionary<string, string>() { { "-i", "FileReader:InputDirectory" } }; } }) .ConfigureServices((context, services) => { Console.WriteLine(context.Configuration.GetSection("FileReader")["InputDirectory"]); services.AddHostedService<Worker>(); }) .Build();
3. 验证运行
执行以下命令:
dotnet run -i ./source/json
此时会输出./source/json,成功覆盖appsettings.json中的tmp值。
问题根源
你之前使用了环境变量的双下划线格式FileReader__InputDirectory,但命令行配置系统不会将其解析为嵌套路径,只会把整个字符串当作扁平的配置键,因此无法匹配JSON中的嵌套配置项,导致覆盖失效。
内容的提问来源于stack exchange,提问作者Daniel Lerps
相关产品推荐
相关产品推荐

