配置的热更新
什么是热更新:一般来说,我们创建的项目都无法做到热更新:即项目无需重启,修改配置文件后读取到的信息就是修改配置之后的
我们只需要吧项目中用到的IOptions改成IOptionsSnapshot即可
那么是怎么实现的呢?
其实我们在添加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的源代码
WebHost.cs源代码:https://github.com/aspnet/MetaPackages/blob/dev/src/Microsoft.AspNetCore/WebHost.cs
我们可以看到CreateDefaultBuilder已经默认加载appsetting.json文件,并启用了热更新
因为如果我们一直要保持文件变更读取的话,就要有一个线程一直对文件进行读取和变更操作。如果我们不想启用默认热更新的话,我们可以将热更新覆盖掉。
配置的框架设计
以下代码部分为伪代码
初始化Builder
var builder = new ConfigurationBuilder()
将source添加到builder
aps.net corewei为我们提供了很多source和添加source的方式
builder.Add(source)
Build
var configurationRoot = builder.Build()
这里的Build实际上是对builder的每一个source进行Build,然后创建一个provider,添加到providers列表中,最后初始化了一个包含了所有的provider的配置
Use
使用的时候实际上是 遍历所有的provider,找到可以使用的provider然后返回value
从上面可以看出来最重要的是source和provider
IConfigurationSource与IConfigurationProvider
我们可以看出Json、Memory、Inl、Command、Xml都实现IConfigurationSource接口
抽象类ConfigurationProvider实现IConfigurationProvider接口,其他的FileIConfigurationProvider(基类,文件的读取)、CommandIConfigurationProvider继承ConfigurationProvider,JsonConfigurationProvider、XmlConfigurationProvider继承FileIConfigurationProvider