配置的熱更新
什么是熱更新:一般來說,我們創建的項目都無法做到熱更新:即項目無需重啟,修改配置文件后讀取到的信息就是修改配置之后的
我們只需要吧項目中用到的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