#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. Спасибо, после исправления многих связанных с этим проблем в других частях приложения мне удалось заставить ваше решение работать. Если у вас есть немного свободного времени, я был бы признателен за более подробную информацию о ваших дополнительных предложениях, в противном случае сейчас все работает правильно.