跟我一起學.NetCore之配置初體驗
前言
配置對於程式來說,絕對是必不可少,畢竟配置是應用或元件動態適應各種環境的最優方案,沒有之一(我還年輕,我是這麼認為的);之前可能用的最多的配置源是命令列、檔案(XML、Json、INI),Web中對於Asp.Net程式設計師Web.Config是接觸的再多不過了,不管怎樣,讀取配置資訊是避免不了啦,但是對於各種配置源不同及格式不同,又得專門開發對應的配置解析程式;不慌,.NetCore內建的配置框架為此一解煩惱,開箱即用,正文詳解,走起~~~
正文
體驗之前,簡單聊聊有關配置的幾個核心型別及其對應的聯絡;
-
IConfiguration:暴露給我們使用的配置物件,其實是底層將不同資料結構的原始資料提取,並進行封裝成一個具有樹形化層次結構
namespace Microsoft.Extensions.Configuration { public interface IConfiguration { // 索引訪問 string this[string key] { get; set; } // 指定Key獲取 配置節點 IConfigurationSection GetSection(string key); // 配置子節點
IConfigurationRoot:根節點,配置的根;
namespace Microsoft.Extensions.Configuration { public interface IConfigurationRoot : IConfiguration { // 對配置資料的重新載入,因為是根,所以會重新載入全部資料void Reload(); // 用於不同配置源獲取獲取資料 IEnumerable<IConfigurationProvider> Providers { get; } } }
IConfigurationSection:其他配置節點,可以理解為子節點;
namespace Microsoft.Extensions.Configuration { public interface IConfigurationSection : IConfiguration { // 資料指定Key值 string Key { get; } // 邏輯樹的路徑,層次用冒號:隔開,如SectionA:SectionB string Path { get; } // 承載的配置資料 string Value { get; set; } } }
關係圖如下:
-
IConfigurationProvider:真正讀取原始配置的資料,並將其轉換一箇中間字典的結構,最後再封裝成IConfiguration;
namespace Microsoft.Extensions.Configuration { public interface IConfigurationProvider { // 獲取指定Key的值 bool TryGet(string key, out string value); // 設定對應Key值 void Set(string key, string value); IChangeToken GetReloadToken(); // 載入配置資料 void Load(); // 獲取指定配置節點所有子節點Key IEnumerable<string> GetChildKeys(IEnumerable<string> earlierKeys, string parentPath); } }
-
IConfigurationSource:原始配置源的體現,每種配置源都會有一個實現該介面的實現類,由於真正讀取配置資料是委託IConfigurationProvider物件進行讀取的,所以IConfigurationSource的作用就是為了提供IConfigurationProvider物件;
namespace Microsoft.Extensions.Configuration { public interface IConfigurationSource { // 提供對應的 IConfigurationProvider物件 IConfigurationProvider Build(IConfigurationBuilder builder); } }
-
IConfigurationBuilder:將IConfigurationSource配置源註冊進行,通過呼叫其Build方法構造出IConfiguration;
namespace Microsoft.Extensions.Configuration { public interface IConfigurationBuilder { IDictionary<string, object> Properties { get; } // 儲存所有註冊進來的 配置源 IList<IConfigurationSource> Sources { get; } // 註冊配置源 IConfigurationBuilder Add(IConfigurationSource source); // 構造出一個Root物件,然後通過root物件就能獲取section,並獲取對應上面的值 IConfigurationRoot Build(); } }
核心物件關係總結:
-
IConfigurationProvider真正讀取配置資料,並將其封裝為中間字典;
-
同的配置源IConfigurationSource提供對應的IConfigurationProvider物件;
-
通過IConfigurationBuilder將不同的IConfigurationSource配置源進行註冊,並創建出對應的IConfiguration物件;
-
通過建立的IConfiguration物件就可以獲取指定節點的值;
核心型別及其關係就簡單說這麼多,接下來對不同配置源進行使用體驗一把,接下來用一個控制檯程式進行演示,老規矩,先通過Nuget安裝核心包:
開始擼程式碼:
-
記憶體配置源
執行結果:
-
命令列配置源
命令列支援的格式:
A. 無字首的 key=value模式
B. 雙中橫線模式--key=value或 --keyvalue
C. 正斜槓模式/key=value或 /key value
開擼:
增加命令列擴充套件包:
模擬命令列傳參,兩種方式:
專案屬性裡面配置
直接在launchSettings.json中配置
程式碼
執行結果
-
檔案配置源
通過Nuget安裝對應檔案型別的包,如下
準備xml、json、ini三個配置源不同的檔案
程式碼應用
執行,正常獲取值
-
環境變數配置源
在之前,估計想不到合適的應用場景將環境變數作為配置源,對不對,如果有,那應該不多;但是現如今docker的存在,讓其變得常用,因為畢竟容器的隔離使得環境變數可以針對對應的容器進行配置;
通過Nuget安裝包
模擬環境變數配置
程式碼走起
執行結果
總結
這裡先寫到這吧,太晚了,今天大概說了幾個關鍵型別的作用及關係,然後針對不同配置源進行舉例演示,用法基本上都是這樣,是不是很簡單;下次咱們聊聊熱更新;