基于选项模式实现.NET Core的配置热更新( 三 )
文章插图
IChnageToken现在 , 让我们回到本文的主题 , 博主你不是要说配置热更新这个话题吗?截至到目前为止 , 我们修改配置文件的时候 , ASP.NET Core 应用明明就会更新配置啊 , 所以 , 博主你到底想说什么?其实 , 博主想说的是 , 的确我们的目的已经达到了 , 但我们不能永远停留在“知其然”的水平 , 如果不试图去了解内在的机制 , 当我们去尝试实现一个自定义配置源的时候 , 就会遇到一些你没有办法想明白的事情 。 所以 , 接下来要讲的 IChnageToken 这个接口可以说是非常重要 。
首先 , 我们把目光聚焦到 CreateDefaultBuilder这个方法 , 它通常在入口文件Program.cs 中被调用 , 主要作用是构造一个 IWebHostBuilder 实例并返回 , 下面是这个方法的内部实现 , 博主这里对其进行了精简:
public static IWebHostBuilder CreateDefaultBuilder(string[] args)
{
//以下简化后的代码片段
builder.ConfigureAppConfiguration((hostingContext, config) =>
{
var env = hostingContext.HostingEnvironment;
config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true);
if (env.IsDevelopment)
{
var appAssembly = Assembly.Load(new AssemblyName(env.ApplicationName));
if (appAssembly != )
{
config.AddUserSecrets(appAssembly, optional: true);
}
}
config.AddEnvironmentVariables;
if (args != )
{
config.AddCommandLine(args);
}
})
}
可以注意到 , 通过 ConfigureAppConfiguration方法 , 框架主要做了下面的工作:
- 从 appsettings.json 和appsettings.${env.EnvironmentName}.json 两个配置文件中加载配置
- 从机密管理器中加载配载
- 从环境变量中加载配置
- 从命令行参数中加载配置
public FileConfigurationProvider(FileConfigurationSource source)
{
if (source == )
{
throw new ArgumentException(nameof(source));
}
Source = source;
if (Source.ReloadOnChange
Load(reload: true);
});
}
}
所以 , 真相就是,所有基于文件的配置提供者 , 都依赖于 FileConfigurationSource , 而通过FileConfigurationSource 暴露出来的FileProvider 都具备监视文件变化的能力 , 更本质上的代码其实应该是下面这样://ChangeToken + IFileProvider 实现对文件的监听
var filePath = @"C:\Users\admin\Downloads\孔乙己.txt";
var directory = System.IO.Path.GetDirectoryName(filePath);
var fileProvider = new PhysicalFileProvider(directory);
ChangeToken.OnChange(
=> fileProvider.Watch("孔乙己.txt"),
=> {
_logger.LogInformation("孔乙己 , 你一定又偷人家书了吧!");
}
);
所以 , 真相只有一个 , 真正帮助我们实现配置热更新的 , 其实是 IChangeToken 这个接口 , 我们只需要把这样一个实例传入到ChangeToken.OnChange 方法中 , 就可以在特定的时机触发这个回调函数 , 而显然 , 对于大多数的IConfigurationProvider 接口而言 , 这个回调函数其实就是Load 方法 , 关于微软提供的ChangeToken 静态类的实现 , 大家如果有兴趣去了解的话 , 可以参考这里: 。 话说回来 , 我们说IOptionsSnapshot和IOptionsMonitor是响应式的 , 当配置发生改变的时候 , 它们对应的值会跟着改变 , 从某种意义上来说 , 是因为IChangeToken提供了这样一个可以监听变化的的能力 , 试想一下 , 我们只需要给每一个IConfigurationProvider对应的IChangeToken注册相同的回调函数 , 那么 , 当某一个IConfigurationProvider 需要重新加载的时候 , 我们就可以针对这个IConfigurationProvider里对应的键值对进行处理 。 事实上 , 微软官方在实现IConfigurationRoot 的时候 , 的确就是这样做的:
- 抖音小店|抖音进军电商,短视频的商业模式与变现,创业者该如何抓住机遇?
- 小店|抖音小店无货源是什么?与传统模式有什么区别?
- 运营|首个OTA智能社区落地 社区运营酿发展模式之变
- 便携式水枪|区城管委保洁一队创新作业模式
- 部署模式|5G toB大戏拉开帷幕,公网专用正当其时
- 模式|破解出租车巡游模式天然短板 嘀嗒出行“出租车·新出行”卓有成效
- 不良|打开“无痕模式”就以为无人知?殊不知,“不良网站”正在利用你
- 模式|刚了解到无货源电商模式,淘宝好还是抖音小店好?
- 冲突|智能互联汽车:通过数据托管模式解决数据使用方面的冲突
- 科技成果|“基于第三代半导体光源的低投射比投影仪关键技术”通过科技成果评价