基于选项模式实现.NET Core的配置热更新( 二 )
[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
private readonly ILogger _logger;
private readonly IOptions _learningOptions;
private readonly IOptionsSnapshot _learningOptionsSnapshot;
private readonly IOptionsMonitor _learningOptionsMonitor;
private readonly IConfiguration _configuration;
public WeatherForecastController(ILogger logger,
IOptions learningOptions,
IOptionsSnapshot learningOptionsSnapshot,
IOptionsMonitor learningOptionsMonitor,
IConfiguration configuration
)
{
_logger = logger;
_learningOptions = learningOptions;
_learningOptionsSnapshot = learningOptionsSnapshot;
_learningOptionsMonitor = learningOptionsMonitor;
_configuration = configuration;
_learningOptionsMonitor.OnChange((options, value) =>
{
_logger.LogInformation($"OnChnage => {JsonConvert.SerializeObject(options)}");
});
}
[HttpGet("{action}")]
public ActionResult GetOptions
{
var builder = new StringBuilder;
builder.AppendLine("learningOptions:");
builder.AppendLine(JsonConvert.SerializeObject(_learningOptions.Value));
builder.AppendLine("learningOptionsSnapshot:");
builder.AppendLine(JsonConvert.SerializeObject(_learningOptionsSnapshot.Value));
builder.AppendLine("learningOptionsMonitor:");
builder.AppendLine(JsonConvert.SerializeObject(_learningOptionsMonitor.CurrentValue));
return Content(builder.ToString);
}
}
【基于选项模式实现.NET Core的配置热更新】现在我们修改一下配置文件 , 因为我们为_learningOptionsMonitor注册了回调函数 , 可以在控制台看到对应的日志:文章插图
此时 , 我们通过 Postman 调用接口 , 我们会得到下面的结果:
文章插图
可以注意到 , 此时 , learningOptions 中的值依然是更新前的值 , 这就是它们三者的区别 , 清楚了吗?
除了这些以外 , 选项模式(Options)中还有一个需要注意的地方 , 是所谓的命名选项(IConfigureNamedOptions) , 主要用在多个 Section 绑定统一属性时 。 譬如现在的应用程序都流行深色主题 , 实际上深色主题和浅色主题具有相同的结构 , 比如前景色和背景色 , 两者唯一的区别是这些颜色配置不一样 。 考虑下面的配置信息:
{
"Themes": {
"Dark": {
"Foreground": "#fff",
"Background": "#000"
},
"White": {
"Foreground": "#000",
"Background": "#fff"
}
}
}
此时 , 我们该如何定义这个主题选项呢?public class ThemeOptions
{
public string Foreground { get; set; }
public string Background { get; set; }
}
接下来 , 我们通过命名的方式来注入两个不同的主题:services.Configure("DarkTheme", Configuration.GetSection("Themes:Dark"));
services.Configure("WhiteTheme", Configuration.GetSection("Themes:White"));
在任何你希望使用它们的地方 , 注入 IOptionsSnapshot 和IOptionsMonitor 即可 , 这两个类型都提供了一个Get 方法 , 传入前面定义好的主题就可以获取到对应的主题了 。 细心的朋友 , 应该会发现一件事情 , 这里三剑客只提到了后面两个 , IOptions 直接被无视了 。 请记住下面这段话:命名的选项只能通过 IOptionsSnapshot 和 IOptionsMonitor 来访问 。 所有选项都是命名实例 。 IConfigureOptions 实例将被视为面向 Options.DefaultName 实例 , 即 string.Empty 。 IConfigureNamedOptions 还可实现 IConfigureOptions 。 IOptionsFactory 的默认实现具有适当地使用每个实例的逻辑 。命名选项用于面向所有命名实例 , 而不是某一特定命名实例 。 ConfigureAll 和 PostConfigureAll 使用此约定 。
- 抖音小店|抖音进军电商,短视频的商业模式与变现,创业者该如何抓住机遇?
- 小店|抖音小店无货源是什么?与传统模式有什么区别?
- 运营|首个OTA智能社区落地 社区运营酿发展模式之变
- 便携式水枪|区城管委保洁一队创新作业模式
- 部署模式|5G toB大戏拉开帷幕,公网专用正当其时
- 模式|破解出租车巡游模式天然短板 嘀嗒出行“出租车·新出行”卓有成效
- 不良|打开“无痕模式”就以为无人知?殊不知,“不良网站”正在利用你
- 模式|刚了解到无货源电商模式,淘宝好还是抖音小店好?
- 冲突|智能互联汽车:通过数据托管模式解决数据使用方面的冲突
- 科技成果|“基于第三代半导体光源的低投射比投影仪关键技术”通过科技成果评价