为 Azure Functions 3.0 添加单例时注入 ILogger
Inject ILogger when adding a Singleton for Azure Functions 3.0
我的 Azure 函数中有一个 redisprovider class:
public RedisCacheProvider(ILogger<RedisCacheProvider> logger,
IConnectionMultiplexer connectionMultiplexer)
{
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
multiplexer = connectionMultiplexer;
}
我将此 class 添加为单例,但如何在启动 class 中初始化 Ilogger。我知道它是由 Azure Functions 注入到 classes 中的。如果是这样,当我们需要在启动时为 class 初始化其他对象时,我如何在启动 class 中管理它?
services.AddSingleton<ICacheProvider>(serviceProvider =>
new RedisCacheProvider(**???**, serviceProvider.GetRequiredService<IConnectionMultiplexer>()));
通常,我这样做:
services.AddSingleton<IHttpService, HttpService>();
在 RedisProvider class 中,我需要传递我的连接字符串。那么在通过IConnectionMultiplexer时如何注入ILogger呢?
我会尽量避免创建那样的单例。不要传递连接字符串,而是考虑将 IOptions<RedisOption>
传递给您的 RedisCacheProvider
以便在构造函数中访问连接字符串。这也将允许您像这样注册您的服务:
services.AddSingleton<ICacheProvider, RedisCacheProvider>()
如果我没理解错的话,你需要手动管理构建,因为你需要注入设置。这就提出了如何注入通常由容器管理的子依赖项的问题。
实际上,我们可以像您已经为多路复用器所做的那样获取子依赖项!
services.AddSingleton<ICacheProvider>(serviceProvider => new RedisCacheProvider(
serviceProvider.GetRequiredService<ILogger>(),
serviceProvider.GetRequiredService<IConnectionMultiplexer>()));
我的 Azure 函数中有一个 redisprovider class:
public RedisCacheProvider(ILogger<RedisCacheProvider> logger,
IConnectionMultiplexer connectionMultiplexer)
{
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
multiplexer = connectionMultiplexer;
}
我将此 class 添加为单例,但如何在启动 class 中初始化 Ilogger。我知道它是由 Azure Functions 注入到 classes 中的。如果是这样,当我们需要在启动时为 class 初始化其他对象时,我如何在启动 class 中管理它?
services.AddSingleton<ICacheProvider>(serviceProvider =>
new RedisCacheProvider(**???**, serviceProvider.GetRequiredService<IConnectionMultiplexer>()));
通常,我这样做:
services.AddSingleton<IHttpService, HttpService>();
在 RedisProvider class 中,我需要传递我的连接字符串。那么在通过IConnectionMultiplexer时如何注入ILogger呢?
我会尽量避免创建那样的单例。不要传递连接字符串,而是考虑将 IOptions<RedisOption>
传递给您的 RedisCacheProvider
以便在构造函数中访问连接字符串。这也将允许您像这样注册您的服务:
services.AddSingleton<ICacheProvider, RedisCacheProvider>()
如果我没理解错的话,你需要手动管理构建,因为你需要注入设置。这就提出了如何注入通常由容器管理的子依赖项的问题。
实际上,我们可以像您已经为多路复用器所做的那样获取子依赖项!
services.AddSingleton<ICacheProvider>(serviceProvider => new RedisCacheProvider(
serviceProvider.GetRequiredService<ILogger>(),
serviceProvider.GetRequiredService<IConnectionMultiplexer>()));