什麼是熱更新:通常來講,咱們建立的項目都沒法作到熱更新:即項目無需重啓,修改配置文件後讀取到的信息就是修改配置以後的git
咱們只須要吧項目中用到的IOptions改爲IOptionsSnapshot便可github
那麼是怎麼實現的呢?json
其實咱們在添加json配置文件的時候每每沒有添加後面兩個參數。app
第一個參數(optional):(Whether the file is optional)是否可選,意思是若是配置文件不存在的時候是否要拋異常。框架
第二個參數(reloadOnChange):(Whether the configuration should be reloaded if the file changes.)是否改變的時候從新加載。asp.net
其實咱們在asp.net core項目中即便不加這兩個參數,只要將IOptions改爲IOptionsSnapshot就會進行熱更新,CreateDefaultBuilder已經替咱們進行了熱更新。ide
下面咱們看一下CreateDefaultBuilder的源代碼ui
WebHost.cs源代碼:https://github.com/aspnet/MetaPackages/blob/dev/src/Microsoft.AspNetCore/WebHost.csspa
咱們能夠看到CreateDefaultBuilder已經默認加載appsetting.json文件,並啓用了熱更新.net
由於若是咱們一直要保持文件變動讀取的話,就要有一個線程一直對文件進行讀取和變動操做。若是咱們不想啓用默認熱更新的話,咱們能夠將熱更新覆蓋掉。
如下代碼部分爲僞代碼
var builder = new ConfigurationBuilder()
aps.net corewei爲咱們提供了不少source和添加source的方式
builder.Add(source)
var configurationRoot = builder.Build()
這裏的Build其實是對builder的每個source進行Build,而後建立一個provider,添加到providers列表中,最後初始化了一個包含了全部的provider的配置
使用的時候其實是 遍歷全部的provider,找到可使用的provider而後返回value
從上面能夠看出來最重要的是source和provider
咱們能夠看出Json、Memory、Inl、Command、Xml都實現IConfigurationSource接口
抽象類ConfigurationProvider實現IConfigurationProvider接口,其餘的FileIConfigurationProvider(基類,文件的讀取)、CommandIConfigurationProvider繼承ConfigurationProvider,JsonConfigurationProvider、XmlConfigurationProvider繼承FileIConfigurationProvider