CSDN|基于选项模式实现.NET Core的配置热更新( 三 )
}
[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);
}
}
现在我们修改一下配置文件 , 因为我们为_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<ThemeOptions>("DarkTheme", Configuration.GetSection("Themes:Dark"));
services.Configure<ThemeOptions>("WhiteTheme", Configuration.GetSection("Themes:White"));
在任何你希望使用它们的地方 , 注入IOptionsSnapshot<ThemeOptions>和IOptionsMonitor<ThemeOptions>即可 , 这两个类型都提供了一个Get 方法 , 传入前面定义好的主题就可以获取到对应的主题了 。 细心的朋友 , 应该会发现一件事情 , 这里三剑客只提到了后面两个 , IOptions<ThemeOptions>直接被无视了 。 请记住下面这段话:命名的选项只能通过 IOptionsSnapshot 和 IOptionsMonitor 来访问 。 所有选项都是命名实例 。 IConfigureOptions 实例将被视为面向 Options.DefaultName 实例 , 即 string.Empty 。 IConfigureNamedOptions 还可实现 IConfigureOptions 。 IOptionsFactory 的默认实现具有适当地使用每个实例的逻辑 。 null 命名选项用于面向所有命名实例 , 而不是某一特定命名实例 。 ConfigureAll 和 PostConfigureAll 使用此约定 。
IChnageToken现在 , 让我们回到本文的主题 , 博主你不是要说配置热更新这个话题吗?截至到目前为止 , 我们修改配置文件的时候 , ASP.NET Core 应用明明就会更新配置啊 , 所以 , 博主你到底想说什么?其实 , 博主想说的是 , 的确我们的目的已经达到了 , 但我们不能永远停留在“知其然”的水平 , 如果不试图去了解内在的机制 , 当我们去尝试实现一个自定义配置源的时候 , 就会遇到一些你没有办法想明白的事情 。 所以 , 接下来要讲的IChnageToken这个接口可以说是非常重要 。
推荐阅读
- |“增长”成娱乐营销必考题,酷营销-CBD模型为最佳选项?
- 苹果笔记本|苹果首款基于自研ARM处理器的MacBook Pro发布 同样采用M1芯片
- |基于Android 11:OPPO Ace2迎ColorOS 11正式版升级
- ColorOS|基于安卓11的ColorOS 11正式版面向Ace2系列推送
- CSDN|小霸王被申请破产重整;虎牙员工自曝被HR抬出公司;Office 2010被微软终止服务|极客头条
- |Kornia开源可微分计算机视觉库,基于Pytorch
- CSDN|可以“作为医生”的 GPT-3,究竟是炒作还是名副其实?
- |再加码社区团购,滴滴的野心从来不止于出行
- CSDN|对话指令集创始人兼CEO潘爱民:面向未来的新型物联网操作系统 | 人物志
- CSDN|给 JDK 报了一个P4 的 Bug,结果居然……