前言

通常程序中配置少不了,配置的修改也避免不了,配置的热更新为此给应用程序带来很大的便捷,不用重启,提高用户体验;但往往有时候需要对修改进行审计,也就是需要记录,有时候也会针对配置修改的时候触发相关操作,比如说发邮件通知,或是其他业务操作等,遇到这种情况,配置变更监听的用处就体现出来了,接下来就尝尝鲜去;

正文

在看前两篇文档的小伙伴可能会看到IConfiguration、IConfigurationProvider接口中有一个GetReloadToken()方法,之前只是注释了一下,其实此方法返回的值就是变更通知的核心,如下图的定义:

看看返回的IChangeToken里定义了什么

对于上面GetReloadToken其实最后返回的真正类型是ConfigurationReloadToken,继承与IChangeToken,其作用就是为了通知程序:改变之后的配置源数据已经通过对应的IConfigurationProvider重新加载;看看其中-本质是啥?

通过以上代码显示,其实ConfigurationReloadToken就是利用CancellationTokenSource在OnReload触发的时候进行通知,这里暂且不深入再研究CancellationTokenSource了,不然感觉要跑题了(可以私下研究研究),停,赶紧回来;

大概了解到变更通知的原理,再来回顾一下配置IConfigurationRoot和IConfigurationSection,微软其实已经实现了两个类,ConfigurationRoot和ConfigurationSection,有默认的实现,简单看看是如何实现的,稍微进行了重点注释哦;

namespace Microsoft.Extensions.Configuration
{// 实现了IConfiguration 和ConfigurationRootpublic class ConfigurationRoot : IConfigurationRoot, IConfiguration, IDisposable{// 用于存放注册进来的IConfigurationProvider,Provider的作用还记得吗?private readonly IList<IConfigurationProvider> _providers;// 默认创建一个ConfirationReloadToken,private ConfigurationReloadToken _changeToken = new ConfigurationReloadToken();// 提供一个_providers的访问属性public IEnumerable<IConfigurationProvider> Providers => _providers;// 实现中括号访问,获取配置值,看过前两篇文章的应该知道都是用中括号的方式获取值public string this[string key]{get{   // 注意,这里倒序遍历,这样就会导致相同Key,后注册的配置源会覆盖之前的for (int num = _providers.Count - 1; num >= 0; num--){if (_providers[num].TryGet(key, out string value)){return value;}}return null;}set{if (!_providers.Any()){throw new InvalidOperationException(Resources.Error_NoSources);}// 其实这里的设置值只是在内存里,没有持久化foreach (IConfigurationProvider provider in _providers){provider.Set(key, value);}}}// 构造函数public ConfigurationRoot(IList<IConfigurationProvider> providers){if (providers == null){throw new ArgumentNullException("providers");}_providers = providers;_changeTokenRegistrations = new List<IDisposable>(providers.Count);// 遍历所有有providers,加载数据foreach (IConfigurationProvider p in providers){// 加载数据p.Load();// 注册监听及回调_changeTokenRegistrations.Add(ChangeToken.OnChange((Func<IChangeToken>)(() => p.GetReloadToken()), (Action)delegate{// 通知RaiseChanged();}));}}// 获取通知Tokenpublic IChangeToken GetReloadToken(){return _changeToken;}// 重新加载数据 public void Reload(){// 遍历所有provider进行重新加载数据foreach (IConfigurationProvider provider in _providers){provider.Load();}// 发送通知RaiseChanged();}// 触发通知private void RaiseChanged(){Interlocked.Exchange(ref _changeToken, new ConfigurationReloadToken()).OnReload();}........省去一些方法......}
}

ConfigurationSection就不贴代码,其实内部大多都是通过调用了IConfigrationRoot对象的方法来实现的,还是贴个图吧,如下:

由ConfigurationRoot可见,触发通知的方法RaiseChanged在ConfigurationRoot构造函数中(ConfigurationProvider对应的IChangeToken回调中调用)及Reload的方法中进行调用,也就是说当IConfigurationProvider捕捉到配置源改变时会利用IChangeToken进行通知,或通过调用Reload方法加载时也会通知;

好了好了,理论就暂且说这么多了,撸撸代码,看看是如何监听的,话说在前头,理论一大堆,使用很简单,哈哈哈哈哈,控制台程序走起来:

运行结果

经过上面案例演示,一个IChangeToken只能通知一次,需要多次创建,如果多次都是自己肯定很麻烦,所以微软已经想到了,提供了一个静态函数,如下代码优化即可:

运行结果:

静态方法这种形式,就是ConfigurationRoot构造函数中IChangeToken监听的方式,忘了的话往上再看看;

总结

有没有被这节给忽悠了,一个这么简单的使用,还说那么多"废话",写文字不累吗? 我去,又过12点了,洗洗睡觉!!!!!;下次开始说说“Option”~~~

----------------------------------------------

一个被程序搞丑的帅小伙,关注"Code综艺圈",跟我一起学~~~

跟我一起学.NetCore之配置变更监听相关推荐

  1. .NET Core开发实战(第12课:配置变更监听)--学习笔记

    12 | 配置变更监听:配置热更新能力的核心 这一节讲解如何使用代码来监视配置变化并做出一些动作 当我们需要追踪配置发生的变化,可以在变化发生时执行一些特定的操作 配置主要提供了一个 GetReloa ...

  2. 6月27日任务 配置Tomcat监听80端口、配置Tomcat虚拟主机、Tomcat日志

    2019独角兽企业重金招聘Python工程师标准>>> 16.4 配置Tomcat监听80端口 1. vim /usr/local/tomcat/conf/server.xml Co ...

  3. 配置Tomcat监听80端口 配置Tomcat虚拟主机 Tomcat日志

    配置Tomcat监听80端口 • vim /usr/local/tomcat/conf/server.xml Connector port="8080" protocol=&quo ...

  4. Tomcat(1)介绍、jdk安装、安装Tomcat ​ 配置Tomcat监听80端口

    Tomcat介绍 (使用yum 下载安装的openjdk下载以后就可以使用) 以下实验用的是在官网下载程序包. Tomcat是一个中间键,要解析java相关的东西,需要先下载JDK 下载jdk 1.下 ...

  5. 16.4 配置Tomcat监听80端口 16.5/16.6/16.7 配置Tomcat虚拟主机16.8 Tomcat日志

    2019独角兽企业重金招聘Python工程师标准>>> 16.4 配置Tomcat监听80端口 直接访问,使用默认的web服务,需要改动端口为80,如果不是80端口那么访问页面的时候 ...

  6. 配置Tomcat监听80端口配置Tomcat虚拟主机Tomcat日志

    2019独角兽企业重金招聘Python工程师标准>>> 16.4 配置Tomcat监听80端口 Tomcat默认监听8080.8005以及8009端口,日常进行浏览器访问时,需要输入 ...

  7. Oracle DBA之配置静态监听(listener registered statically)

    为什么80%的码农都做不了架构师?>>>    (1)listener.ora 本次实验将配置静态监听到listener L1上,项目SID_LIST_L1为L1的静态监听配置信息: ...

  8. 58.配置tomcat监听80 虚拟主机 日志

    2019独角兽企业重金招聘Python工程师标准>>> 16.4 配置Tomcat监听80端口 16.5/16.6/16.7 配置Tomcat虚拟主机(有如何创建一个zrlog博客) ...

  9. oracle配置的监听文件,配置oracle监听文件

    配置oracle监听文件 如果自己配置的监听文件总是出错,可以复制线面的信息进到自己配置文件中更改主机信息即可 [[email protected] admin]$ cat tnsnames.ora ...

最新文章

  1. B - Frogger POJ - 2253
  2. dicom文件_图像识别 | 使用Python对医学Dicom文件的预处理(含代码)
  3. PCA主成分分析 特征降维 opencv实现
  4. 【解放日报】除了CEO首席执行官,你了解CIO吗?
  5. 奇葩属性:layout_weight 的解释及使用
  6. Flutter SDK升级
  7. PHP压缩CSS文件
  8. Android动画居然还能这么写
  9. 第14章 系统异常情况记录
  10. 汇编语言 王爽 第四版 实验2
  11. bzoj21012101: [Usaco2010 Dec]Treasure Chest 藏宝箱(滚动数组优化dp)
  12. 打开PHP时候,提示找不到指定模块解决办法
  13. 微软project服务器搭建,Project Server 2013 安装和部署概述
  14. 英语学习笔记(二)语法
  15. git pull命令操作 git pull <remote> <branch>
  16. vue ui网页创建项目失败
  17. java冻结账号功能代码_java-JFrame在连续运行代码时冻结
  18. 2602 Bone Collector
  19. 树莓派 Pico(raspberry pi pico)极简入门
  20. 如何将谷歌地图导出为百度瓦片

热门文章

  1. redis下并发问题解决方案
  2. Mybatis批量更新数据
  3. Linux shell命令 cp 加上-f还是提示是否覆盖
  4. 本地服务器下的局域网安全吗_本地安全认证服务器
  5. xbox360链接pc_如何将实时电视从Xbox One流式传输到Windows PC,iPhone或Android Phone
  6. 浏览器显示无法解析服务器的DNS地址,使用搜狗浏览器时突然弹出无法解析服务器的DNS地址该如何处理...
  7. web前端工程师热门岗位技能要求前瞻
  8. CentOS下MySQL忘记root密码解决方法【转载】
  9. setTimeout(function(){}, 0);
  10. 【cocos2d-js官方文档】二十五、Cocos2d-JS v3.0中的单例对象