CSDN|基于选项模式实现.NET Core的配置热更新( 五 )
}
);
所以 , 真相只有一个 , 真正帮助我们实现配置热更新的 , 其实是IChangeToken这个接口 , 我们只需要把这样一个实例传入到ChangeToken.OnChange方法中 , 就可以在特定的时机触发这个回调函数 , 而显然 , 对于大多数的IConfigurationProvider接口而言 , 这个回调函数其实就是Load方法 , 关于微软提供的ChangeToken静态类的实现 , 大家如果有兴趣去了解的话 , 可以参考这里:https://github.com/dotnet/extensions/blob/release/3.1/src/Primitives/src/ChangeToken.cs 。 话说回来 , 我们说IOptionsSnapshot<T>和IOptionsMonitor<T>是响应式的 , 当配置发生改变的时候 , 它们对应的值会跟着改变 , 从某种意义上来说 , 是因为IChangeToken提供了这样一个可以监听变化的的能力 , 试想一下 , 我们只需要给每一个对应的IChangeToken注册相同的回调函数 , 那么 , 当某一个需要重新加载的时候 , 我们就可以针对这个里对应的键值对进行处理 。 事实上 , 微软官方在实现IConfigurationRoot的时候 , 的确就是这样做的:
public class ConfigurationRoot : IConfigurationRoot
{
private ConfigurationReloadToken _changeToken = new ConfigurationReloadToken;
private IList<IConfigurationProvider> _providers;
public ConfigurationRoot(IList<IConfigurationProvider> providers)
{
_providers = providers;
foreach (var provider in providers)
{
provider.Load;
ChangeToken.OnChange( => provider.GetReloadToken, this.RaiseChanged);
}
}
public IChangeToken GetReloadToken => return _changeToken;
private void RaiseChanged
{
Interlocked.Exchange<ConfigurationReloadToken>(ref _changeToken, new ConfigurationReloadToken).OnReload;
}
public void Reload
{
foreach (var provider in _providers)
{
provider.Load;
}
this.RaiseChanged;
}
}
自定义配置源好了 , 现在你可以说你了解 .NET Core 的配置热更新这个话题了 , 因为截至到此时此刻 , 我们不仅仅达到了一开始的目的 , 而且深刻地理解了它背后蕴含的原理 。 这样 , 我们就可以向着下一个目标:自定义配置源努力了 。 前面提到过 , .NET Core 里面支持各种各样的配置源 , 实际中可能会遇到更多的配置源 , 比如不同的数据库、YAML 格式以及 Apollo、Consul、Nacos 这些配置中心等等 , 所以 , 了解如何去写一个自定义的配置源还是非常有必要的 。 我们在一开始的时候提到了 Redis 的发布-订阅 , 那么 , 下面我们就来基于发布-订阅实现一个简单的配置中心 , 当我们需要修改配置时 , 只需要通过可视化的 Redis 工具进行修改 , 然后再给指定的客户端发一条消息即可 。
实现自定义配置源 , 需要实现IConfigurationSource和IConfigurationProvider两个接口 , 前者实现起来非常简单 , 因为只要返回我们定义的RedisConfigurationProvider实例即可:
public class RedisConfigurationSource : IConfigurationSource
{
private readonly RedisConfigurationOptions _options;
public IConfigurationProvider Build(IConfigurationBuilder builder)
{
推荐阅读
- |“增长”成娱乐营销必考题,酷营销-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,结果居然……