关于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在单例模式下,每次可以获取到最新的配置,保证配置的变更。