1. 程式人生 > 實用技巧 >跟我一起學.NetCore之配置初體驗

跟我一起學.NetCore之配置初體驗

前言

配置對於程式來說,絕對是必不可少,畢竟配置是應用或元件動態適應各種環境的最優方案,沒有之一(我還年輕,我是這麼認為的);之前可能用的最多的配置源是命令列、檔案(XML、Json、INI),Web中對於Asp.Net程式設計師Web.Config是接觸的再多不過了,不管怎樣,讀取配置資訊是避免不了啦,但是對於各種配置源不同及格式不同,又得專門開發對應的配置解析程式;不慌,.NetCore內建的配置框架為此一解煩惱,開箱即用,正文詳解,走起~~~

正文

體驗之前,簡單聊聊有關配置的幾個核心型別及其對應的聯絡;

  • IConfiguration:暴露給我們使用的配置物件,其實是底層將不同資料結構的原始資料提取,並進行封裝成一個具有樹形化層次結構

    的IConfiguration物件;根節點和其他配置節點都繼承IConfiguration;

    namespace Microsoft.Extensions.Configuration
    {
        public interface IConfiguration
        {
            // 索引訪問    
            string this[string key] { get; set; }
            // 指定Key獲取 配置節點        
            IConfigurationSection GetSection(string key);
             // 配置子節點          
    IEnumerable<IConfigurationSection> GetChildren(); // 用於配置變化通知使用 IChangeToken GetReloadToken(); } }

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();
        }
    }

核心物件關係總結:

  1. IConfigurationProvider真正讀取配置資料,並將其封裝為中間字典;

  2. 同的配置源IConfigurationSource提供對應的IConfigurationProvider物件;

  3. 通過IConfigurationBuilder將不同的IConfigurationSource配置源進行註冊,並創建出對應的IConfiguration物件;

  4. 通過建立的IConfiguration物件就可以獲取指定節點的值;

核心型別及其關係就簡單說這麼多,接下來對不同配置源進行使用體驗一把,接下來用一個控制檯程式進行演示,老規矩,先通過Nuget安裝核心包:

開始擼程式碼:

  • 記憶體配置源

執行結果:

  • 命令列配置源

    命令列支援的格式

    A. 無字首的 key=value模式

B. 雙中橫線模式--key=value或 --keyvalue

C. 正斜槓模式/key=value或 /key value

開擼:

增加命令列擴充套件包:

模擬命令列傳參,兩種方式:

專案屬性裡面配置

直接在launchSettings.json中配置

程式碼

執行結果

  • 檔案配置源

    通過Nuget安裝對應檔案型別的包,如下

    準備xml、json、ini三個配置源不同的檔案

    程式碼應用

    執行,正常獲取值

  • 環境變數配置源

在之前,估計想不到合適的應用場景將環境變數作為配置源,對不對,如果有,那應該不多;但是現如今docker的存在,讓其變得常用,因為畢竟容器的隔離使得環境變數可以針對對應的容器進行配置;

通過Nuget安裝包

模擬環境變數配置

程式碼走起

執行結果

總結

這裡先寫到這吧,太晚了,今天大概說了幾個關鍵型別的作用及關係,然後針對不同配置源進行舉例演示,用法基本上都是這樣,是不是很簡單;下次咱們聊聊熱更新;