关于IOptionsMonitor在单例依赖注入下的使用问题

如下面代码所示,在服务AdminLogClient中依赖AdminLogOptions配置项,但是这种写法会导致将IAdminLogClient注入为单例时,_logOptions变量的值无法响应配置的变更,这时_logOptions的值也是单例的。

public class AdminLogClient : IAdminLogClient
{
    private readonly ILogger _logger;
    private readonly AdminLogOptions _logOptions;

    public AdminLogClient(ILoggerFactory loggerFactory, IOptionsMonitor<AdminLogOptions> optionsDelegate)
    {
        _logger = loggerFactory.CreateLogger(AdminLogConfig.LoggerCategoryName);
        _logOptions = optionsDelegate.CurrentValue;
    }
}

需要换一种写法,如下:

public class AdminLogClient : IAdminLogClient
{
    private AdminLogOptions LogOptions => _optionsMonitor.CurrentValue;
    private readonly IOptionsMonitor<AdminLogOptions> _optionsMonitor;
    private readonly ILogger _logger;

    public AdminLogClient(ILoggerFactory loggerFactory,  IOptionsMonitor<AdminLogOptions> optionsMonitor)
    {
        _logger = loggerFactory.CreateLogger(AdminLogConfig.LoggerCategoryName);
        _optionsMonitor = optionsMonitor;
    }
}

将配置变量设置为只读属性,每次获取配置时从_optionsMonitor.CurrentValue中去读取,这样可以保证IAdminLogClient在单例模式下,每次可以获取到最新的配置,保证配置的变更。

posted @ 2021-01-07 11:37  Yeah的第七章  阅读(367)  评论(0编辑  收藏  举报