.net 使用命令行参数速记开关重写嵌套的AppSettings配置

wljmcqd8  于 2023-07-01  发布在  .NET
关注(0)|答案(2)|浏览(104)

在我的应用程序中,我使用appsettings来加载配置。我有appsettings.json

{
  "FileReader": {
    "InputDirectory": "tmp"
  }
}

我希望能够使用命令行参数速记开关(例如:-i)。我知道我可以通过一个名为FileReader__InputDirectory的环境变量覆盖它,但是对于我的Program.cs中的SwitchMappings,我不知道什么值会起作用。下面是我的代码:

IHost host = Host.CreateDefaultBuilder(args)
    .ConfigureAppConfiguration((context, builder) =>
    {
        builder
            .AddJsonFile("appsettings.json", false, false)
            .AddJsonFile($"appsettings.{context.HostingEnvironment.EnvironmentName}.json", true, false)
            .AddEnvironmentVariables()
            .AddCommandLine(source =>
            {
                source.Args = args;
                source.SwitchMappings = new Dictionary<string, string>()
                {
                    { "-i", "FileReader__InputDirectory" } // <-- what is the correct mapping here?
                };
            });
    })
    .ConfigureServices((context, services) =>
    {
        Console.WriteLine(context.Configuration.GetSection("FileReader")["InputDirectory"]);
        services.AddHostedService<Worker>();
    })
    .Build();

当我运行dotnet run -i ./source/json时,我希望打印出的值是source/json(参数中的值),但我得到的是tmpappsettings.json文件中的值)。
如果我尝试在appsettings根级别上使用属性而不进行嵌套,它会工作得很好。

6yt4nkrj

6yt4nkrj1#

使用:作为分隔符:

source.SwitchMappings = new Dictionary<string, string>()
{
     { "-i", "FileReader:InputDirectory" } 
};

__:的替代,特别是对于环境变量。
请注意,您可以通过CLI参数(see this answer)传递它:

dotnet run --FileReader:InputDirectory=./source/json

参见:

  • .NET中的配置:绑定层次结构
  • 环境变量配置提供程序:

:分隔符并不适用于所有平台上的环境变量分层键。例如,Bash不支持:分隔符。所有平台都支持双下划线(__),它会自动替换环境变量中的任何:分隔符。

insrf1ej

insrf1ej2#

看起来真实的的问题是如何添加新的参数Map,而不是如何覆盖设置。
所有配置源都可以通过ConfigurationBuilder.Sources列表获得。配置代码可以找到现有的源并更改其Map:

.ConfigureAppConfiguration((context, builder) =>
{
    var cliSource=builder.Sources.OfType<CommandLineConfigurationSource>();
    if(cliSource!=null)
    {
        cliSource.SwitchMappings=new Dictionary<string, string>()
                {
                    { "-i", "FileReader:InputDirectory" }
                };
    }
}

删除整个ConfigureAppConfiguration部分,并在命令行中使用--FileReader:InputDirectory覆盖JSON设置。

dotnet run --FileReader:InputDirectory=tmp

通用主机配置JSON、环境变量 * 和 * CLI参数。没有必要再次添加相同的源。
ASP.NET核心配置中的命令行参数部分显示了如何使用各种分隔符(如--=/)传递参数,例如:

dotnet run /MyKey "Using /" /Position:Title=Cmd /Position:Name=Cmd_Rick

dotnet run --MyKey "Using --" --Position:Title=Cmd --Position:Name=Cmd_Rick

在您的情况下,可以使用

dotnet run --FileReader:InputDirectory=tmp

相关问题