CSDN|基于选项模式实现.NET Core的配置热更新( 四 )
首先 , 我们把目光聚焦到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 != null)
{
config.AddUserSecrets(appAssembly, optional: true);
}
}
config.AddEnvironmentVariables;
if (args != null)
{
config.AddCommandLine(args);
}
})
}
可以注意到 , 通过ConfigureAppConfiguration方法 , 框架主要做了下面的工作:
- 从appsettings.json和appsettings.${env.EnvironmentName}.json两个配置文件中加载配置
- 从机密管理器中加载配载
- 从环境变量中加载配置
- 从命令行参数中加载配置
public FileConfigurationProvider(FileConfigurationSource source)
{
if (source == null)
{
throw new ArgumentNullException(nameof(source));
}
Source = source;
if (Source.ReloadOnChange && Source.FileProvider != null)
{
_changeTokenRegistration = ChangeToken.OnChange(
=> Source.FileProvider.Watch(Source.Path),
=> {
Thread.Sleep(Source.ReloadDelay);
Load(reload: true);
});
}
}
所以 , 真相就是,所有基于文件的配置提供者 , 都依赖于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("孔乙己 , 你一定又偷人家书了吧!");
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- |“增长”成娱乐营销必考题,酷营销-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,结果居然……