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("孔乙己 , 你一定又偷人家书了吧!");
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- ColorOS|基于安卓12开发!一加8系列终于迎来ColorOS 12公测:正式发布只差一步
- 苹果|苹果忍无可忍!逼用户升级iOS 15:取消留在iOS 14选项
- 丰田|缩小版埃尔法 全新丰田Noah/Voxy官图发布:基于TNGA打造
- 小米|MIUI 13全球升级计划公布:19款设备、全部基于安卓12
- 小米12|刷机方便了!小米12全系内核源码公布:基于Android 12
- 华为|长安C385首台全工装样车下线!基于长安/华为/宁德时代CHN平台打造
- 智能手机|雷军:小米12基于手感和体验设计 不简单拼参数堆配置
- 奥迪|基于纯电平台打造 奥迪三款新车将国产:含“电动版”A6L
- 苹果|苹果“性价比”显示器要来!基于24寸iMac设计 价格更便宜
- CPU处理器|RISC-V架构国产芯片10连发:4款基于阿里平头哥玄铁内核
