具有强类型配置的ConfigurationBuilder

时间:2018-04-03 14:30:41

标签: c# asp.net-core configuration

如何创建搜索环境变量的ConfigurationBuilder,然后,如果找不到,则使用appSetting参数?

目前我的代码:

public void ConfigureServices(IServiceCollection services)
{
    // Get configuration
    var environmentName = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
    var configuration = new ConfigurationBuilder()
        .SetBasePath(Directory.GetCurrentDirectory())
        .AddEnvironmentVariables()
        .AddJsonFile("appsettings.json", optional: false, reloadOnChange: false)
        .AddJsonFile($"appsettings.{environmentName}.json", optional: true, reloadOnChange: false)
        .Build();
    var settings = new AppSettings();
    configuration.GetSection("App").Bind(settings);

    // ...

    services.AddSingleton<ILogger, LogConsole>()
        .AddSingleton<IDatabaseManager, PostgresDatabaseManager>()
        .AddSingleton<IDbConnectionFactory, PostgreDbConnectionFactory>()
        .Configure<AppSettings>(configuration.GetSection("App"))
        .AddOptions()
        .BuildServiceProvider();
}

问题在于&#34; .Configure<AppSettings>(configuration.GetSection("App"))&#34;只保留AppSettings中的内容,但如下所示:

img

configuration包含我的所有环境变量(Count = 89)和AppSettings变量。

我尝试了以下发现的事情:
https://www.jerriepelser.com/blog/aspnet-core-no-more-worries-about-checking-in-secrets/

但我认为此类配置与强类型配置不匹配。

1 个答案:

答案 0 :(得分:1)

默认情况下这是怎么回事。您定义配置提供程序的顺序很重要。 ASP.NET Core将以相同的顺序使用它们。基本上,它所做的只是从每个源收集值并将它们放在字典中。当使用每个进一步的源时,它或者向字典添加额外的键值对或者覆盖现有的键值对,就像字典总是那样。这会创建一个简单但有效的覆盖能力,因为您添加的最后一个配置源将始终对特定键的值具有最后的发言权。

例如,在你的情况下。首先加载环境变量。然后,将解析您的JSON文件,并添加任何值。因此,如果您没有定义特定的环境变量,默认情况下它的值将来自JSON文件。

如果您想要相反的方式,如果设置了环境变量,那么该值而不是JSON文件中定义的值是应该使用的值,只需更改提供者的顺序:

.AddJsonFile("appsettings.json", optional: false, reloadOnChange: false)
.AddJsonFile($"appsettings.{environmentName}.json", optional: true, reloadOnChange: false)
.AddEnvironmentVariables()