Внедрить ILogger при добавлении синглтона для функций Azure 3.0

#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 Ядро