Внедрение зависимостей функций Azure — Регистрация класса, зависящего от подраздела конфигурации

#c# #dependency-injection #configuration #azure-functions

Вопрос:

Это в функции Azure.

Вот весь мой курс по стартапам.

 public class Startup : FunctionsStartup
    {
        public override void Configure(IFunctionsHostBuilder builder)
        {
            IConfiguration configuration = builder.Services.BuildServiceProvider().GetService<IConfiguration>();
            //builder.Services.AddSingleton<MySystemMessage>(new MySystemMessage(configuration.GetSection("AzureFunctionsJobHost")));
            builder.Services.AddScoped<IMySystemMessage, MySystemMessage>();
        }
    }
 

Я регистрировал класс как одноэлементный и передавал подраздел конфигурации в качестве параметра конструктору. (см. прокомментированный код)

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

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

Ответ №1:

Делегат фабрики может быть использован при регистрации службы. У вас будет доступ к встроенному поставщику услуг для устранения любых зависимостей.

 public class Startup : FunctionsStartup {
    public override void Configure(IFunctionsHostBuilder builder) {            
        builder.Services.AddScoped<IMySystemMessage, MySystemMessage>(sp => {
            IConfiguration configuration = sp.GetService<IConfiguration>();
            return new MySystemMessage(configuration.GetSection("AzureFunctionsJobHost"));
        });
    }
}
 

Я бы предложил использовать строго типизированную зависимость, которая сопоставляется с подразделом. Таким образом, нет необходимости вводить грязный препарат повсюду. Вы также можете рассмотреть возможность использования встроенного шаблона опций с IOptions

Комментарии:

1. Спасибо, после исправления многих связанных с этим проблем в других частях приложения мне удалось заставить ваше решение работать. Если у вас есть немного свободного времени, я был бы признателен за более подробную информацию о ваших дополнительных предложениях, в противном случае сейчас все работает правильно.