Как получить ранний доступ к конфигурации в службе приложений Azure? - PullRequest
0 голосов
/ 17 апреля 2020

У меня есть приложение, которое будет использовать некоторые внешние микросервисы, которые я создал. Приложение и микросервисы размещены в Azure Службах приложений. Функциональность микросервисов необходима внутри класса Startup, поэтому я регистрирую эти зависимости заранее (при создании IWebHostBuilder). Микросервисы также зависят от значений конфигурации (предоставляемых приложением), поэтому я также выполняю некоторую конфигурацию IOptions Pattern при создании IWebHostBuilder для получения настроек из appsettings.json. Этот файл настроек содержит настройки, которые будут использоваться во всех средах, а также некоторые из них, которые зависят от среды c. Я собирался использовать параметры из файла для локальной разработки и переопределить параметры c, определяемые средой, с помощью блейда конфигурации в службе приложений. В других приложениях, которые я создал, настройки блейд-конфигурации действительно переопределяют значения из appsettings.json.

Однако, кажется, что при ранней настройке, как показано в приведенном ниже коде, служба приложений не работает переопределить настройки, и поэтому мои локальные настройки разработки в конечном итоге используются в службе приложений (и все взрывается). Я сделал снимок в темноте и переместил параметры c, определяемые средой, из appsettings.json в их собственный файл JSON с другим именем. Сейчас я только загружаю этот файл рано. Это не помогло решить мою проблему.

Итак, мой вопрос: какие существуют методы для того, чтобы параметры конфигурации были доступны до Startup, но при этом можно переопределить эти параметры в Azure Службах приложений? Я изучил документацию. NET Core по конфигурации, но есть так много вариантов и подходов, что они заставляют мою голову вращаться. Я сейчас использую. NET Core 2.2. Заранее спасибо!

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

    private static IWebHostBuilder CreateWebHostBuilder(string[] args)
    {
        return WebHost.CreateDefaultBuilder(args)
            .ConfigureAppConfiguration((context, builder) => { builder.AddEarlyRequiredConfiguration(); })
            .ConfigureServices((context, services) => { services.AddEarlyRequiredServices(context); })
            .UseStartup<Startup>();
    }

    private static void AddEarlyRequiredServices(this IServiceCollection services, WebHostBuilderContext context)
    {
        // This extension method is in a separate assembly, and registers the microservices.
        // It also configures the IOptions stuff for the configuration values.
        services.AddMyMicroservices(context);
    }

    private static void AddEarlyRequiredConfiguration(this IConfigurationBuilder builder)
    {
        builder.AddJsonFile("appsettings.json");
    }
}

1 Ответ

0 голосов
/ 21 апреля 2020

Не стесняйтесь опубликовать лучший ответ, если у вас есть. Это может быть не совсем идеально, но так я с этим справился.

Я начал создавать файлы настроек в предложенной форме appsettings.{Environment}.json. Я не использовал названия готовых сред Microsoft (Разработка, Подготовка, Производство). Вместо этого я настроил их для среды моей организации. В launchSettings.json я установил значение для переменной среды ASPNETCORE_ENVIRONMENT, которое указывает мою локальную среду разработки. В Службах приложений я настроил эту же переменную среды, чтобы иметь соответствующие значения для этих сред. Поскольку что-либо в appsettings.json не будет не переопределено при ранней регистрации, я поместил все настройки, которые необходимо переопределить, в эти файлы среды, указанные c. Любые настройки, которые я хотел указать только в конфигурации службы приложений, я вообще исключил из файлов настроек. Наконец, я изменил свой метод ранней регистрации, чтобы он выглядел следующим образом:

private static void AddEarlyRequiredConfiguration(
        this IConfigurationBuilder builder,
        WebHostBuilderContext context)
    {
        builder.AddJsonFile("appsettings.json");
        builder.AddJsonFile($"appsettings.{context.HostingEnvironment.EnvironmentName}.json");
    }
}

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

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