You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过命令行短开关覆盖嵌套的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 14:07:37