为 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>()

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

如果我没理解错的话,你需要手动管理构建,因为你需要注入设置。这就提出了如何注入通常由容器管理的子依赖项的问题。

实际上,我们可以像您已经为多路复用器所做的那样获取子依赖项!

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