问题描述
我的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>()