配置的热更新

什么是热更新:这个词听着有点熟悉,但到底是什么呢?
一般来说:创建的项目都无法做到热更新:即项目无需重启,修改配置文件后读取到的信息就是修改配置之后的
我们只需要吧项目中用到的IOptions改成IOptionsSnapshot即可
 菜鸟入门【ASP.NET Core】6:配置的热更新、配置的框架设计-LMLPHP

看好了,接下来是步骤:
在添加json配置文件的时候往往没有添加后面两个参数。
这两参数用来干嘛的呢?
第一个参数(optional):(Whether the file is optional)是否可选,意思是如果配置文件不存在的时候是否要抛异常。
第二个参数(reloadOnChange):(Whether the configuration should be reloaded if the file changes.)是否改变的时候重新加载。
asp.net core项目中即使不加这两个参数,只要将IOptions改成IOptionsSnapshot就会进行热更新,CreateDefaultBuilder已经替我们进行了热更新。
走起: 瞧瞧CreateDefaultBuilder的源代码
菜鸟入门【ASP.NET Core】6:配置的热更新、配置的框架设计-LMLPHP

CreateDefaultBuilder已经默认加载appsetting.json文件,并启用了热更新
 
因为如果一直要保持文件变更读取的话,就要有一个线程一直对文件进行读取和变更操作。如果我们不想启用默认热更新的话,我们可以将热更新覆盖掉。
 

配置的框架设计

以下代码部分为伪代码
初始化Builder
var builder = new ConfigurationBuilder(
将source添加到builder
aps.net core为我们提供了很多source和添加source的方式
builder.Add(source)
 
 
Build
var configurationRoot = builder.Build()
 
Build实际上是对builder的每一个source进行Build,然后创建一个provider,添加到providers列表中,最后初始化了一个包含了所有的provider的配置
菜鸟入门【ASP.NET Core】6:配置的热更新、配置的框架设计-LMLPHP
 
Use
使用的时候实际上是 遍历所有的provider,找到可以使用的provider然后返回value
 菜鸟入门【ASP.NET Core】6:配置的热更新、配置的框架设计-LMLPHP

可以看出来最重要的是source和provider
 

IConfigurationSource与IConfigurationProvider

 菜鸟入门【ASP.NET Core】6:配置的热更新、配置的框架设计-LMLPHP

可以看出Json、Memory、Inl、Command、Xml都实现IConfigurationSource接口
 菜鸟入门【ASP.NET Core】6:配置的热更新、配置的框架设计-LMLPHP

抽象类ConfigurationProvider实现IConfigurationProvider接口,其他的FileIConfigurationProvider(基类,文件的读取)、
CommandIConfigurationProvider继承ConfigurationProvider,JsonConfigurationProvider、
XmlConfigurationProvider继承FileIConfigurationProvider
04-30 19:33