Как добавить файл appsettings. json в мою конфигурацию Azure Function 3.0? - PullRequest
3 голосов
/ 29 января 2020

Новый Azure Function 3.0 SDK предоставляет способ реализации класса Startup. Он предоставляет доступ к набору служб, доступных посредством внедрения зависимостей, где я могу добавить свои собственные компоненты и сторонние службы.

Но я не знаю, как использовать файл конфигурации.

[assembly: FunctionsStartup(typeof(MyNamespace.Startup))]
namespace MyNamespace
{
    public class Startup : FunctionsStartup
    {
        public override void Configure(IFunctionsHostBuilder builder)
        {
...

Мои сторонние службы принимают в качестве параметра большие структуры, и эти файлы конфигурации копируются с помощью двоичных файлов. Я могу скопировать их в подраздел appsettings. json file:

{
  "MachineLearningConfig" : {
     ( about 50+ parameters and subsections )
  }
}

Значения конфигурации обновляются в соответствии со средой развертывания. Я использую Azure Задачу преобразования файлов Devops для этого: производственные значения отличаются от промежуточных и dev-значений.

Учитывая документацию https://docs.microsoft.com/en-us/azure/azure-functions/functions-dotnet-dependency-injection, способ загрузки этих параметров:

builder.Services.AddOptions<MachineLearningConfig>()
                .Configure<IConfiguration>((settings, configuration) =>
                                           {
                                                configuration.GetSection("MachineLearningConfig").Bind(settings);
                                           });

Но для этого необходимо добавить все настройки как ключ / значение строки в среде хоста, и это то, что я не хочу делать. Их слишком много, и поддерживать их не так просто, как в файле конфигурации json.

Я скопировал appsettings. json рядом с хостом. json .

Но файл appsettings. json, читаемый при запуске с помощью Azure Function SDK, не является набором приложений моего приложения. json, но Azure Набор функций функциональных инструментов. json. Так что configuration.GetSection("MachineLearningConfig") возвращает пустые значения, так как в папке Azure Function tools нет файла appsettings.

Итак, мой вопрос: как получить мой MachineLearningConfig раздел, прочитанный из моего appsetting.json файла, введенного как IOption<MachineLearningConfig> в мое приложение?

Ответы [ 4 ]

2 голосов
/ 06 февраля 2020

Решение Nkosi работает довольно хорошо, но оно обновляет способ, которым среда выполнения функции azure загружает настройки для себя, заменяя синглтон IConfiguration: services.AddSingleton<IConfiguration>.

Я предпочитаю иметь другую IConfiguration Root, которая не вводится Мне просто нужно ввести мои настройки IOption<MachineLearningSettings>, которые связаны с моей собственной конфигурацией IConfiguration Root.

Я создаю другую конфигурацию IConfiguration Root, которая является членом класса запуска:

public class Startup : FunctionsStartup
{
    private IConfigurationRoot _functionConfig = null;

    private IConfigurationRoot FunctionConfig( string appDir ) => 
        _functionConfig ??= new ConfigurationBuilder()
            .AddJsonFile(Path.Combine(appDir, "appsettings.json", optional: true, reloadOnChange: true)).Build();

    public override void Configure(IFunctionsHostBuilder builder)
    {
         builder.Services.AddOptions<MachineLearningSettings>()
             .Configure<IOptions<ExecutionContextOptions>>((mlSettings, exeContext) =>
                 FunctionConfig(exeContext.Value.AppDirectory).GetSection("MachineLearningSettings").Bind(mlSettings) );
    }
}

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

1 голос
/ 01 февраля 2020

В классе запуска:

    IConfigurationRoot config = new ConfigurationBuilder()
              .SetBasePath(Environment.CurrentDirectory)
              .AddJsonFile("someSettings.json", optional: true, reloadOnChange: true)
              .AddEnvironmentVariables()
              .Build();

Добавьте в проект файл json, содержащий настройки. Обратите внимание, что local.settings. json игнорируется / удаляется во время развертывания. (Назовите файл как-нибудь еще.)

1 голос
/ 05 февраля 2020

После некоторых исследований я наткнулся на эту тему на Githib

, используя настройки приложений. json + IConfiguration в Function App

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

public static class FunctionHostBuilderExtensions {
    /// <summary>
    /// Set up the configuration for the builder itself. This replaces the 
    /// currently registered configuration with additional custom configuration.
    /// This can be called multiple times and the results will be additive.
    /// </summary>
    public static IFunctionsHostBuilder ConfigureHostConfiguration (
        this IFunctionsHostBuilder builder, 
        Action<IServiceProvider, IConfigurationBuilder> configureDelegate) {
        IServiceCollection services = builder.Services;            
        var providers = new List<IConfigurationProvider>();            
        //Cache all current configuration provider
        foreach (var descriptor in services.Where(d => d.ServiceType == typeof(IConfiguration)).ToList()) {
            var existingConfiguration = descriptor.ImplementationInstance as IConfigurationRoot;
            if (existingConfiguration is null) {
                continue;
            }
            providers.AddRange(existingConfiguration.Providers);
            services.Remove(descriptor);
        }
        //add new configuration based on original and newly added configuration
        services.AddSingleton<IConfiguration>(sp => {
            var configurationBuilder = new ConfigurationBuilder();                    
            //call custom configuration
            configureDelegate?.Invoke(sp, configurationBuilder);                
            providers.AddRange(configurationBuilder.Build().Providers);                
            return new ConfigurationRoot(providers);
        });            
        return builder;
    }
}

Основная идея состоит в том, чтобы извлечь все зарегистрированные в настоящее время типы, связанные с конфигурацией, создать новый компоновщик, применить пользовательскую конфигурацию и построить новую конфигурацию с помощью детали оригинальной и пользовательской конфигурации объединены в одну.

Затем она будет использоваться в Startup

public class Startup : FunctionsStartup {
    public override void Configure(IFunctionsHostBuilder builder) {
        builder.ConfigureHostConfiguration((sp, config) => {
            var executioncontextoptions = sp.GetService<IOptions<ExecutionContextOptions>>().Value;
            var currentDirectory = executioncontextoptions.AppDirectory;

            config
                .SetBasePath(currentDirectory)
                .AddJsonFile("appSettings.json", optional: true, reloadOnChange: true)
                .AddEnvironmentVariables();

            //if there are multiple settings files, consider extracting the list,
            //enumerating it and adding them to the configuration builder.
        });

        builder.Services
            .AddOptions<MachineLearningConfig>()
            .Configure<IConfiguration>((settings, configuration) => {
                configuration.GetSection("MachineLearningConfig").Bind(settings);
            });
    }
}

Теперь вышеприведенное должно иметь возможность получить настройки из вашей пользовательской конфигурации.

0 голосов
/ 01 февраля 2020

Когда вы разрабатываете приложение функции локально, вы должны хранить локальные копии этих значений в файле проекта local.settings.json. Чтобы узнать больше, см. Файл Local settings.

Самый простой способ загрузить необходимые настройки в ваше функциональное приложение в Azure - это использовать Управление Application Settings... ссылка, которая отображается после того, как вы успешно опубликовали sh ваш проект.

См. example о том, как получить эти значения настроек.

var config = new ConfigurationBuilder()
                .SetBasePath(currentDirectory)
                .AddJsonFile("local.settings.json", optional: true, reloadOnChange: true)
                .AddEnvironmentVariables()
                .Build();

вот это sample project

...