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) {


推荐阅读