【问题标题】:Inject ILogger when adding a Singleton for Azure Functions 3.0在为 Azure Functions 3.0 添加单例时注入 ILogger
【发布时间】:2020-08-17 07:17:50
【问题描述】:

我的 Azure Function 中有一个 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 呢?

【问题讨论】:

  • 要提供 一些 参数,而将其余参数留给容器,我们可以使用ActivatorUtilities.CreateInstance&lt;T&gt;(serviceProvider, customParam1, customParam2, ...)。如果我们希望经常这样做,我们可以使用ActivatorUtilities.CreateFactory(type, customParam1, customParam2, ...) 编译一个高效、可重用的工厂。

标签: c# .net-core azure-functions stackexchange.redis


【解决方案1】:

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

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

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

【讨论】:

  • 好的,非常感谢!我认为我最初为 ILogger 做同样的事情时做错了什么。
【解决方案2】:

我会尽量避免创建这样的单例。不要传递连接字符串,而是考虑将IOptions&lt;RedisOption&gt; 传递给您的RedisCacheProvider,以便在构造函数中访问连接字符串。这也将允许您像这样注册您的服务:

services.AddSingleton<ICacheProvider, RedisCacheProvider>()

延伸阅读:Options pattern in ASP.NET Core

【讨论】:

    猜你喜欢
    • 2020-12-03
    • 1970-01-01
    • 2020-07-16
    • 2020-03-04
    • 2020-09-13
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 2020-05-29
    相关资源
    最近更新 更多