使用 UseSetting 覆盖配置

Uri*_*iil 2 .net c# configuration .net-core asp.net-core

我正在使用 .NET Core 2.2、默认模板并尝试使用 UseSetting 覆盖配置,但是我无法使其工作。在配置中将测试值设置为文件,我想在代码中使用相同的值覆盖它,然后在启动中我想获取覆盖的值。

(最初我试图添加 AzureKeyVaultProvider,但它对我不起作用,我以这个示例结束)

配置:

{
  "Logging": {
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "AllowedHosts": "*",
  "Test": "file" 
}
Run Code Online (Sandbox Code Playgroud)

程序.cs:

public class Program
{
    public static void Main(string[] args)
    {
        CreateWebHostBuilder(args).Build().Run();
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>()
            .UseSetting("Test", "code");
}
Run Code Online (Sandbox Code Playgroud)

启动.cs:

public class Startup
{
    private readonly IConfiguration _configuration;

    public Startup(IConfiguration configuration)
    {
        _configuration = configuration;
    }

    public void ConfigureServices(IServiceCollection services)
    {
        var value = _configuration.GetValue<string>("Test");
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        app.Run(async (context) =>
        {
            await context.Response.WriteAsync("Hello World!");
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

Kir*_*kin 5

UseSetting适用于主机配置,在应用程序配置之前应用。在您的示例中,JSON 值覆盖了该UseSetting值。UseSetting设置主机配置中的值,该值将被复制到应用程序配置中,然后被 JSON 值覆盖。

使用ConfigureAppConfigurationAddInMemoryCollection来达到预期的结果:

WebHost.CreateDefaultBuilder(args)
    .UseStartup<Startup>()
    .ConfigureAppConfiguration((ctx, configurationBuilder) =>
    {
        configurationBuilder.AddInMemoryCollection(new Dictionary<string, string>
        {
            ["Test"] = "code"
        });
    });
Run Code Online (Sandbox Code Playgroud)

通过此设置,调用中使用的值将AddInMemoryCollection覆盖 JSON、env 等中的所有其他值。