跟我一起学.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:SectionBstring?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();//?獲取指定配置節點所有子節點KeyIEnumerable<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對象就能獲取p,并獲取對應上面的值????????IConfigurationRoot Build();} }
? ?核心對象關系總結:
IConfigurationProvider真正讀取配置數據,并將其封裝為中間字典;
同的配置源IConfigurationSource提供對應的IConfigurationProvider對象;
通過IConfigurationBuilder將不同的IConfigurationSource配置源進行注冊,并創建出對應的IConfiguration對象;
通過創建的IConfiguration對象就可以獲取指定節點的值;
????核心類型及其關系就簡單說這么多,接下來對不同配置源進行使用體驗一把,接下來用一個控制臺程序進行演示,老規矩,先通過Nuget安裝核心包:
????開始擼代碼:
內存配置源
?????運行結果:
命令行配置源
命令行支持的格式:
A. 無前綴的 key=value模式
B. 雙中橫線模式?--key=value或 --key?value
C. 正斜杠模式?/key=value或 /key value
開擼:
增加命令行擴展包:
模擬命令行傳參,兩種方式:
項目屬性里面配置
????????直接在launchSettings.json中配置
????? ?代碼? ?
????????運行結果
文件配置源
通過Nuget安裝對應文件類型的包,如下
準備xml、json、ini三個配置源不同的文件
代碼應用
運行,正常獲取值
環境變量配置源
???????在之前,估計想不到合適的應用場景將環境變量作為配置源,對不對,如果有,那應該不多;但是現如今docker的存在,讓其變得常用,因為畢竟容器的隔離使得環境變量可以針對對應的容器進行配置;
????通過Nuget安裝包
????
????模擬環境變量配置
????代碼走起
????運行結果
???
總結
????這里先寫到這吧,太晚了(明天整理一下發出),這里大概說了幾個關鍵類型的作用及關系,然后針對不同配置源進行舉例演示,用法基本上都是這樣,是不是很簡單;下次咱們聊聊熱更新;
總結
以上是生活随笔為你收集整理的跟我一起学.NetCore之配置初体验的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于脑机接口该如何实现的考虑
- 下一篇: asp.net ajax控件工具集 Au