.Net Core ConfigureAppConfiguration добавление дополнительных источников, переопределяющих параметры среды - PullRequest
0 голосов
/ 20 декабря 2018

При использовании IConfigurationBuilder в приложении .NET Core 2.1 с универсальным хостом я настраиваю 4 источника;но после объема ConfigureAppConfiguration есть 6 источников.

В какой-то момент 2 уже загруженный дополнительный источник добавляется во второй раз в порядке, который приводит к скрытию значений appsettings.Environment.json.Я также попытался удалить конфигурацию hostsettings.json и убедился, что это не влияет.Это для веб-задания Azure с использованием WebjobsSDK 3.0 и .Net Core 2.1

    var builder = new HostBuilder()
        .ConfigureHostConfiguration(configurationBuilder =>
        {
             //This is to do some basic host configuration and should only add 2 sources
         configurationBuilder.SetBasePath(Directory.GetCurrentDirectory());
                configurationBuilder.AddJsonFile("hostsettings.json", optional: true);
                configurationBuilder.AddEnvironmentVariables(prefix: "APPSETTING_ASPNETCORE_");
            })
            .ConfigureAppConfiguration((hostContext, configurationBuilder) =>
            {
                //at this point there are 0 sources in the sources
                IHostingEnvironment env = hostContext.HostingEnvironment;
                configurationBuilder.SetBasePath(Directory.GetCurrentDirectory());
                configurationBuilder.AddJsonFile("appSettings.json", optional: false, reloadOnChange: true)
                    .AddJsonFile($"appSettings.{env.EnvironmentName}.json", optional: true,
                        reloadOnChange: true);
                configurationBuilder.AddEnvironmentVariables(prefix: "APPSETTING_ASPNETCORE_");
               //at this point there are 4 sources
            })
            .ConfigureServices((hostContext, servicesCollection) =>
            {
                //now there are 6, 2 additional source that are duplicates
                servicesCollection.Configure<IConfiguration>(hostContext.Configuration);

})

Я ожидаю, что поставщик конфигурации будет иметь только 4 источника, включая ChainedConfigSource. У меня есть настройкабыть включеннымНо добавлены 2 дополнительных источника, которые являются дубликатами appsettings.json и переменных среды, которые я объявил перед загрузкой appsettings.environment.json для конкретной среды.

Теперь при добавлении в класс настроек appsettings.jsonбыли добавлены последними и возвращены через appsettings.environment.json

Ответы [ 2 ]

0 голосов
/ 27 декабря 2018

Таким образом, согласно документации, WebHostBuilder загружает файлы appSettings.json и appSettings.env.json для вас.Но это ничего не говорит о том, что HostBuilder делает это, я полагаю, что это связано с отсутствием документации, и я не могу определить, откуда в исходном коде поступает.

Чтобы решить эту проблему, я изменил способ настройки файлов конфигурации.Ранее у меня были строки подключения в файле appSettings.json, а также в файлах appSettings.env.json.Поэтому у меня возникла проблема с файлами конфигурации, добавленными в последний раз при замене значений из базового файла конфигурации.Теперь я перенес настройки на основе среды только в файлы конфигурации, которые предназначены для каждой среды, и сохранил настройки, которые были глобальными для всех сред, в файле базовой конфигурации.

Похоже, старые привычки в настройках преобразования .NET Framework умирают с трудом.Я не могу определить, должен ли один и тот же ключ в конфигурации ICon, объявленной от нескольких провайдеров, быть изменен на последнего загруженного провайдера, я думал, что некоторая документация покрывала это и подтвердила это, но теперь я не могу найти его.

0 голосов
/ 21 декабря 2018

Читая исходный код класса Hostbuilder.cs, вы увидите, что Конфигурация, добавленная в AddHostingConfiguration, добавляется в ApplicationConfiguration.

Позвольте мне показать вам, вы можете найти источник в https://github.com/aspnet/AspNetCore/blob/1c3fa82908fe2cb773626b6613843213286a482b/src/Microsoft.Extensions.Hosting/HostBuilder.cs

При вызове сборки сначала создается HostingConfiguration, а затем AppConfiguration.

Вот код, который создает HostingConfiguration

    private void BuildHostConfiguration()
    {
        var configBuilder = new ConfigurationBuilder();
        foreach (var buildAction in _configureHostConfigActions)
        {
            buildAction(configBuilder);
        }
        _hostConfiguration = configBuilder.Build();
     }

Теперь в BuildAppConfiguration вы увидите, что HostingConfigurationдобавляется поверх AppConfiguration

    private void BuildAppConfiguration()
    {
        var configBuilder = new ConfigurationBuilder();
        //Here _hostConfiguration gets added ontop
        configBuilder.AddConfiguration(_hostConfiguration);
        foreach (var buildAction in _configureAppConfigActions)
        {
            buildAction(_hostBuilderContext, configBuilder);
        }
        _appConfiguration = configBuilder.Build();
        _hostBuilderContext.Configuration = _appConfiguration;
    }

Теперь функции сборки являются частными, и нет способа сбрасывать / очищать источники из компоновщика.

Если вы не хотите реализовывать собственную версию HostBuilder, я бы посоветовал не отделять настройки хоста от ваших настроек приложений

...