#c# #.net-core #azure-functions #stackexchange.redis
#c# #.net-ядро #azure-функции #stackexchange.redis
Вопрос:
У меня есть класс redisprovider в моей функции Azure:
public RedisCacheProvider(ILogger<RedisCacheProvider> logger,
IConnectionMultiplexer connectionMultiplexer)
{
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
multiplexer = connectionMultiplexer;
}
Я добавляю этот класс как синглтон, но как мне инициализировать Ilogger в классе startup. Я знаю, что он внедряется функциями Azure в классы. Если да, то как мне управлять этим в классе startup, когда нам нужно инициализировать другие объекты для класса при запуске?
services.AddSingleton<ICacheProvider>(serviceProvider =>
new RedisCacheProvider(**???**, serviceProvider.GetRequiredService<IConnectionMultiplexer>()));
Обычно я делаю это:
services.AddSingleton<IHttpService, HttpService>();
В классе RedisProvider мне нужно передать свою строку подключения. Итак, как мне внедрить ILogger при передаче IConnectionMultiplexer?
Комментарии:
1. Чтобы предоставить некоторые параметры, но оставить остальное на усмотрение контейнера, мы можем использовать
ActivatorUtilities.CreateInstance<T>(serviceProvider, customParam1, customParam2, ...)
. Если мы планируем делать это часто, мы можем скомпилировать эффективную фабрику многократного использования с помощьюActivatorUtilities.CreateFactory(type, customParam1, customParam2, ...)
.
Ответ №1:
Если я правильно понимаю, вам нужно управлять построением вручную, поскольку вам нужно вводить настройки. В связи с этим возникает вопрос о том, как внедрить подчиненные зависимости, которые обычно управляются контейнером.
На самом деле, мы можем получить подчиненные зависимости точно так же, как вы уже делаете для мультиплексора!
services.AddSingleton<ICacheProvider>(serviceProvider => new RedisCacheProvider(
serviceProvider.GetRequiredService<ILogger>(),
serviceProvider.GetRequiredService<IConnectionMultiplexer>()));
Комментарии:
1. Да, большое вам спасибо! Я думаю, что изначально я сделал что-то неправильно, когда делал то же самое для ILogger.
Ответ №2:
Я бы постарался избежать создания подобных синглетов. Вместо передачи строки подключения рассмотрите возможность передачи IOptions<RedisOption>
вашему RedisCacheProvider
, чтобы получить доступ к строке подключения в конструкторе. Это также позволило бы вам зарегистрировать свой сервис следующим образом:
services.AddSingleton<ICacheProvider, RedisCacheProvider>()
Дальнейшее чтение: Шаблон параметров в ASP.NET Ядро