services.AddSingleton <IConfiguration>назначение в .NET Core - PullRequest
0 голосов
/ 02 июля 2019

Нам нужно читать из нескольких наборов приложений на основе локальных или нет. Мы достигли этого, добавив appsettings.local.json.

Но мы видим, что, хотя мы добавили этот файл и настроили необходимые конфигурации, мы не смогли прочитать данные конфигурации из appsettings.local.json, все время он видел appsettings.json.

Позвольте мне сказать по коду:

public static void Main(string[] args)
{
    var config = new ConfigurationBuilder()
        .SetBasePath(Directory.GetCurrentDirectory())
        .AddJsonFile("appsettings.json")
        .AddJsonFile("appsettings.local.json", optional: true)
        .AddEnvironmentVariables()
        .AddCommandLine(args)
        .Build();

    CreateWebHostBuilder(args, config).Build().Run();
}

public static IWebHostBuilder CreateWebHostBuilder(string[] args, IConfiguration config)
{
    var webHostBuilder = WebHost.CreateDefaultBuilder(args)
        .UseApplicationInsights()
        .ConfigureServices(services => services.AddSingleton<IConfiguration>(config))
        .UseStartup<Startup>();

    return webHostBuilder;
}

В CreateWebHostBuilder, если мы не добавим .ConfigureServices(services => services.AddSingleton<IConfiguration>(config)), мы не сможем прочитать данные из appsettings.local.json. Добавив это, мы можем прочитать из appsettings.local.json. Итак, мой вопрос: что здесь произошло? Может ли кто-нибудь дать разумное объяснение?

1 Ответ

2 голосов
/ 02 июля 2019

То, что вы делаете, это то, что вы создаете отдельный компоновщик конфигурации, который загружает свои собственные источники. Вы делаете это, хотя по умолчанию компоновщик веб-хоста уже содержит несколько источников конфигурации, включая файлы appsettings.json и appsettings.<environment>.json.

Говоря services.AddSingleton<IConfiguration>(config), вы фактически заменяете конфигурацию по умолчанию своей собственной. Хотя это, вероятно, будет иметь правильный эффект в большинстве случаев, я могу себе представить, что это может привести к некоторым проблемам позже, поскольку у вас фактически есть две разные конфигурации в вашем приложении (хотя одна из них - конфигурация по умолчанию - в основном недоступна).

Как правило, я бы рекомендовал вам не делать этого, а изменить конфигурацию по умолчанию, чтобы она загружала все нужные вам источники. Вы можете сделать это, позвонив по номеру WebHostBuilder.ConfigureAppConfiguration:

public static IWebHostBuilder CreateWebHostBuilder(string[] args, IConfiguration config)
{
    var webHostBuilder = WebHost.CreateDefaultBuilder(args)
        .UseApplicationInsights()
        .ConfigureAppConfiguration(config =>
        {
            config.AddJsonFile("appsettings.local.json", optional: true);
        })
        .UseStartup<Startup>();

    return webHostBuilder;
}

Теперь это добавит еще один файл JSON в конструктор конфигурации по умолчанию. Поэтому значение по умолчанию IConfiguration будет также принимать значения конфигурации из этого источника. Таким образом, вам не нужно будет создавать ConfigurationBuilder внутри вашего Program.cs.

Обратите внимание, что appsettings.local.json теперь является последним источником конфигурации, поэтому, какие бы ни были настроены параметры, будут перезаписаны ранее настроенные параметры. Так что учтите это, если вы используете аргументы командной строки или переменные окружения.

В заключение отметим, что если вы намеревались использовать файл local только в определенной локальной среде, то вы также можете просто установить для среды хостинга значение local для автоматической загрузки appsettings.local.json как часть настройки конфигурации по умолчанию. Это связано с тем, что компоновщик хоста по умолчанию автоматически выберет appsettings.<environment>.json, если он существует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...