在为Azure Functions 3.0添加Singleton时注入ILogger

问题描述

我的Azure函数中有一个redisprovider类:

        public RedisCacheProvider(ILogger<RedisCacheProvider> logger,IConnectionMultiplexer connectionMultiplexer)
        {
            _logger = logger ?? throw new ArgumentNullException(nameof(logger));
            multiplexer = connectionMultiplexer;
        }

我将该类作为单例添加,但是如何在启动类中初始化Ilogger。我知道它是由Azure Functions注入到类中的。如果是这样,当我们需要在启动时为该类初始化其他对象时,如何在启动类中进行管理?

 services.AddSingleton<ICacheProvider>(serviceProvider =>
                    new RedisCacheProvider(**???**,serviceProvider.GetRequiredService<IConnectionMultiplexer>()));

通常,我这样做:

services.AddSingleton<IHttpService,HttpService>();

在RedisProvider类中,我需要传递连接字符串。那么,当我通过IConnectionMultiplexer时如何注入ILogger?

解决方法

如果我理解正确,则由于需要注入设置,因此需要手动管理构造。这就提出了一个问题,即如何注入通常由容器管理的子依赖项。

实际上,就像您对多路复用器所做的一样,我们可以获取从属关系!

services.AddSingleton<ICacheProvider>(serviceProvider => new RedisCacheProvider(
    serviceProvider.GetRequiredService<ILogger>(),serviceProvider.GetRequiredService<IConnectionMultiplexer>()));
,

我会尽量避免创建这样的单例。除了访问连接字符串,还可以考虑将IOptions<RedisOption>传递到RedisCacheProvider以便在构造函数中访问连接字符串。这也使您可以像这样注册服务:

services.AddSingleton<ICacheProvider,RedisCacheProvider>()

进一步阅读:Options pattern in ASP.NET Core

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...