12:配置变更监听-.NET Core开发实战
.NET Core开发实战前文传送门:
- 第1课:课程介绍
- 第2课:内容综述
- 第3课:.NET Core的现状、未来以及环境搭建
- 第4课:Startup:掌握ASP.NET Core的启动过程
- 第5课:依赖注入:良好架构的起点(上)
- 第5课:依赖注入:良好架构的起点(中)
- 第5课:依赖注入:良好架构的起点(下)
- 第6课:作用域与对象释放行为(上)
- 第6课:作用域与对象释放行为(下)
- 第7课:用Autofac增强容器能力(上)
- 第7课:用Autofac增强容器能力(下)
- 第8课:配置框架:让服务无缝适应各种环境
- 第9课:命令行配置提供程序
- 第10课:环境变量配置提供程序
- 第11课:文件配置提供程序
12 | 配置变更监听:配置热更新能力的核心
这一节讲解如何使用代码来监视配置变化并做出一些动作
当我们需要追踪配置发生的变化,可以在变化发生时执行一些特定的操作
配置主要提供了一个 GetReloadToken 方法,这就是跟踪配置的关键方法
接着使用上一节的代码
var builder = new ConfigurationBuilder(); builder.AddJsonFile("appsettings.json", optional:true, reloadOnChange:true); var configurationRoot = builder.Build(); IChangeToken token = configurationRoot.GetReloadToken();
IChangeToken 有两个属性和一个方法
public interface IChangeToken { bool HasChanged { get; } bool ActiveChangeCallbacks { get; } IDisposable RegisterChangeCallback(Action<object> callback, object state); }
接着注册 Callback
token.RegisterChangeCallback(state => { Console.WriteLine($"Key1:{configurationRoot["Key1"]}"); Console.WriteLine($"Key2:{configurationRoot["Key2"]}"); Console.WriteLine($"Key3:{configurationRoot["Key3"]}"); }, configurationRoot);
启动程序,修改配置文件,触发 Callback
多次修改配置文件没有效果?
因为 IChangeToken 这个对象只能使用一次,也就是说捕获到变更并且执行代码之后,需要再重新获取一个新的 IChangeToken,再次注册
token.RegisterChangeCallback(state => { Console.WriteLine($"Key1:{configurationRoot["Key1"]}"); Console.WriteLine($"Key2:{configurationRoot["Key2"]}"); Console.WriteLine($"Key3:{configurationRoot["Key3"]}"); token = configurationRoot.GetReloadToken(); token.RegisterChangeCallback(state2 => { Console.WriteLine(); }, configurationRoot); }, configurationRoot);
这将变成一个无限循环的过程,微软实际上提供了一个比较方便使用的快捷的扩展方法,这个方法可以帮助我们轻松地处理这件事,也就意味着每次触发完成以后可以重新绑定
ChangeToken.OnChange(() => configurationRoot.GetReloadToken(), () => { Console.WriteLine($"Key1:{configurationRoot["Key1"]}"); Console.WriteLine($"Key2:{configurationRoot["Key2"]}"); Console.WriteLine($"Key3:{configurationRoot["Key3"]}"); });
第一个参数是获取 IChangeToken 的方法
第二个参数是处理变更的注入方法
启动程序,修改配置文件,多次触发 Callback

原文出处:微信公众号【DotNet NB】,作者【郑子铭】
原文链接:https://mp.weixin.qq.com/s/J1FAYSqzHY4cFaDutguW_g
本文观点不代表Dotnet9立场,转载请联系原作者。