跟我一起学.NetCore之配置初体验
前言
????配置對(duì)于程序來說,絕對(duì)是必不可少,畢竟配置是應(yīng)用或組件動(dòng)態(tài)適應(yīng)各種環(huán)境的最優(yōu)方案,沒有之一(我還年輕,我是這么認(rèn)為的);之前可能用的最多的配置源是命令行、文件(XML、Json、INI),Web中對(duì)于Asp.Net程序員Web.Config是接觸的再多不過了,不管怎樣,讀取配置信息是避免不了啦,但是對(duì)于各種配置源不同及格式不同,又得專門開發(fā)對(duì)應(yīng)的配置解析程序;不慌,.NetCore內(nèi)置的配置框架為此一解煩惱,開箱即用,正文詳解,走起~~~
正文
????體驗(yàn)之前,簡(jiǎn)單聊聊有關(guān)配置的幾個(gè)核心類型及其對(duì)應(yīng)的聯(lián)系;
IConfiguration:暴露給我們使用的配置對(duì)象,其實(shí)是底層將不同數(shù)據(jù)結(jié)構(gòu)的原始數(shù)據(jù)提取,并進(jìn)行封裝成一個(gè)具有樹形化層次結(jié)構(gòu)的IConfiguration對(duì)象;根節(jié)點(diǎn)和其他配置節(jié)點(diǎn)都繼承IConfiguration;
namespace Microsoft.Extensions.Configuration {public interface IConfiguration{// 索引訪問????string?this[string?key]?{?get;?set;?}// 指定Key獲取 配置節(jié)點(diǎn)????????IConfigurationSection?GetSection(string?key);//?配置子節(jié)點(diǎn)??????????IEnumerable<IConfigurationSection>?GetChildren();//?用于配置變化通知使用????????IChangeToken GetReloadToken();} }
????????? IConfigurationRoot:根節(jié)點(diǎn),配置的根;
namespace Microsoft.Extensions.Configuration {public interface IConfigurationRoot : IConfiguration{//?對(duì)配置數(shù)據(jù)的重新加載,因?yàn)槭歉?#xff0c;所以會(huì)重新加載全部數(shù)據(jù)void?Reload();//?用于不同配置源獲取獲取數(shù)據(jù)IEnumerable<IConfigurationProvider> Providers { get; }} }?? IConfigurationSection:其他配置節(jié)點(diǎn),可以理解為子節(jié)點(diǎn);
namespace Microsoft.Extensions.Configuration {public interface IConfigurationSection : IConfiguration{//?數(shù)據(jù)指定Key值string?Key?{?get;?}//?邏輯樹的路徑,層次用冒號(hào):隔開,如SectionA:SectionBstring?Path?{?get;?}//?承載的配置數(shù)據(jù)string Value { get; set; }} }關(guān)系圖如下:
IConfigurationProvider:真正讀取原始配置的數(shù)據(jù),并將其轉(zhuǎn)換成一個(gè)中間字典的結(jié)構(gòu),最后再封裝成IConfiguration;
namespace Microsoft.Extensions.Configuration {public interface IConfigurationProvider{?? // 獲取指定Key的值bool TryGet(string key, out string value);// 設(shè)置對(duì)應(yīng)Key值void Set(string key, string value);IChangeToken GetReloadToken();// 加載配置數(shù)據(jù)void?Load();//?獲取指定配置節(jié)點(diǎn)所有子節(jié)點(diǎn)KeyIEnumerable<string> GetChildKeys(IEnumerable<string> earlierKeys, string parentPath);} }IConfigurationSource:原始配置源的體現(xiàn),每種配置源都會(huì)有一個(gè)實(shí)現(xiàn)該接口的實(shí)現(xiàn)類,由于真正讀取配置數(shù)據(jù)是委托IConfigurationProvider對(duì)象進(jìn)行讀取的,所以IConfigurationSource的作用就是為了提供IConfigurationProvider對(duì)象;
namespace Microsoft.Extensions.Configuration {public interface IConfigurationSource{//?提供對(duì)應(yīng)的?IConfigurationProvider對(duì)象IConfigurationProvider Build(IConfigurationBuilder builder);} }IConfigurationBuilder:將IConfigurationSource配置源注冊(cè)進(jìn)行,通過調(diào)用其Build方法構(gòu)造出IConfiguration;
namespace Microsoft.Extensions.Configuration {public interface IConfigurationBuilder{IDictionary<string,?object>?Properties?{?get;?}// 保存所有注冊(cè)進(jìn)來的 配置源????????IList<IConfigurationSource>?Sources?{?get;?}// 注冊(cè)配置源????????IConfigurationBuilder?Add(IConfigurationSource?source);//?構(gòu)造出一個(gè)Root對(duì)象,然后通過root對(duì)象就能獲取p,并獲取對(duì)應(yīng)上面的值????????IConfigurationRoot Build();} }
? ?核心對(duì)象關(guān)系總結(jié):
IConfigurationProvider真正讀取配置數(shù)據(jù),并將其封裝為中間字典;
同的配置源IConfigurationSource提供對(duì)應(yīng)的IConfigurationProvider對(duì)象;
通過IConfigurationBuilder將不同的IConfigurationSource配置源進(jìn)行注冊(cè),并創(chuàng)建出對(duì)應(yīng)的IConfiguration對(duì)象;
通過創(chuàng)建的IConfiguration對(duì)象就可以獲取指定節(jié)點(diǎn)的值;
????核心類型及其關(guān)系就簡(jiǎn)單說這么多,接下來對(duì)不同配置源進(jìn)行使用體驗(yàn)一把,接下來用一個(gè)控制臺(tái)程序進(jìn)行演示,老規(guī)矩,先通過Nuget安裝核心包:
????開始擼代碼:
內(nèi)存配置源
?????運(yùn)行結(jié)果:
命令行配置源
命令行支持的格式:
A. 無前綴的 key=value模式
B. 雙中橫線模式?--key=value或 --key?value
C. 正斜杠模式?/key=value或 /key value
開擼:
增加命令行擴(kuò)展包:
模擬命令行傳參,兩種方式:
項(xiàng)目屬性里面配置
????????直接在launchSettings.json中配置
????? ?代碼? ?
????????運(yùn)行結(jié)果
文件配置源
通過Nuget安裝對(duì)應(yīng)文件類型的包,如下
準(zhǔn)備xml、json、ini三個(gè)配置源不同的文件
代碼應(yīng)用
運(yùn)行,正常獲取值
環(huán)境變量配置源
???????在之前,估計(jì)想不到合適的應(yīng)用場(chǎng)景將環(huán)境變量作為配置源,對(duì)不對(duì),如果有,那應(yīng)該不多;但是現(xiàn)如今docker的存在,讓其變得常用,因?yàn)楫吘谷萜鞯母綦x使得環(huán)境變量可以針對(duì)對(duì)應(yīng)的容器進(jìn)行配置;
????通過Nuget安裝包
????
????模擬環(huán)境變量配置
????代碼走起
????運(yùn)行結(jié)果
???
總結(jié)
????這里先寫到這吧,太晚了(明天整理一下發(fā)出),這里大概說了幾個(gè)關(guān)鍵類型的作用及關(guān)系,然后針對(duì)不同配置源進(jìn)行舉例演示,用法基本上都是這樣,是不是很簡(jiǎn)單;下次咱們聊聊熱更新;
總結(jié)
以上是生活随笔為你收集整理的跟我一起学.NetCore之配置初体验的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于脑机接口该如何实现的考虑
- 下一篇: 跟我一起学.NetCore之Asp.Ne