.NET平臺開源專案速覽(20)Newlife.Core中簡單靈活的配置檔案
如果用知乎,可以關注專欄:
記得5年前開始拼命翻讀X元件的原始碼,特別是XCode,但對Newlife.Core 的東西瞭解很少,最多隻是會用用,而且用到的只是九牛一毛。裡面好用的東西太多了。
最近一年時間,零零散散又學了很多,也瞭解了很多,不會寫那總要學會用吧,今天就給大家介紹裡面非常好用的自定義配置檔案用法。
X元件的介紹我就不多說了,看這裡多年前系列文章:
說明:文章是多年前的,但這些年變動也很大,最好看看原始碼,基本用法都還差不多。
1.關於配置檔案
說道配置檔案,大家覺得太平凡和普通了,有人說有App.Config本來就可以用,何必搞這麼多灰機。
可是飛機型別也很多,有空何必不嘗試一下這個型號的飛機。
實際上App.Config裡面對自定義的配置不太適合,加一堆,多了看起來也難受。而且有時候不同外部元件可能也帶配置檔案,多了就分不清楚了。
還有很多系統的配置可能需要及時生效(在不需要重新啟動的情況下),以及程式中使用的簡單,靈活性,也是一個重點。。。
吹了這麼多水,那來看點實際的,看看Newlife.Core裡面的配置檔案有啥新東東。
2.Newlife.Core的配置功能
我總結的這個配置檔案最大的優點:
1.開發過程中建立一個配置檔案非常方便。整合,加屬性,加預設值,如果有其他邏輯,補充一下。
2.使用極其方便,通過XXX類名.Current.屬性名 就可以直接對配置項進行讀寫。
3.修改及時生效,可以設定生效時間,這樣很多情況下,程式不用重啟配置就能及時生效。
4.程式啟動如果發現沒有該配置專案,會自動新建預設配置檔案。與XCode的反向工程異曲同工。
5.支援列表,字典等複雜資料結構。
6.程式碼註釋和XML檔案的註釋匹配。
下面看看使用Demo:
3.Newlife.Core的配置的玩法
3.1 新建配置檔案類
來個案例:加上要給一個應用程式加一個增加一個自定義配置檔案:
配置項有(純屬虛構,不要糾結):
Debug(是否除錯模式)
BatchSize(每批次處理的資料記錄數),
ServiceName(服務名稱)
CacheTime(快取清理時間)
UserList(要監控的使用者列表)
KvDemo(鍵值對)
首先,新建一個配置類:AppSet,程式碼如下(一般就是複製一份):
/// <summary>應用自定義配置</summary> [Description("應用自定義配置")] [XmlConfigFile("Config/AppSet.config", 3000)] public class AppSet : XmlConfig { /// <summary>除錯開關。預設false</summary> [Description("除錯開關。預設false")] public Boolean Debug { get; set; } = false; /// <summary>每批次處理的資料記錄數</summary> [Description("每批次處理的資料記錄數")] public Int32 BatchSize { get; set; } = 20000; /// <summary>服務名稱</summary> [Description("服務名稱")] public String ServiceName { get; set; } = "AppServer"; /// <summary>快取清理時間</summary> [Description("服務資料處理的執行緒數,32")] public DateTime CacheTime { get; set; } = DateTime.Now.AddHours(5); /// <summary>要監控的使用者ID列表</summary> [Description("要監控的使用者ID列表")] public List UserList { get; set; } = new List() { 123,23,98,38}; /// <summary>鍵值對</summary> [Description("鍵值對")] public Dictionary<Int32, string> KvDemo { get; set; } = new Dictionary<int, string>(){ { 1,"aaa"},{2,"bbb"},{ 3,"ccc"} }; }
配置檔案說明:
1.類的特性:Description是整個XML配置檔案的註釋,XmlConfigFile定義檔案位置和名稱,以及生效時間3000ms
2.屬性中的Description特性也是對該屬性的說明(都會寫入配置檔案),至於註釋大家都知道,智慧提示有用
3.對屬性的賦值是配置的預設值,程式啟動第一次使用該類,如果配置檔案不存在,就會自動採用這裡的值建立,否則以存在的檔案值為準
4.程式中可以動態修改和儲存配置。
3.2 配置檔案使用
每個配置檔案都有一個靜態的Current屬性,通過靜態物件來對整個配置檔案進行操作。例如
var name = AppSet.Current.ServiceName ;//讀取配置 AppSet.Current.ServiceName = "TestName";//設定配置 AppSet.Current.Save();//配置儲存,有非同步方法,程式中動態進行
如果程式第一次使用該配置類,在bin目錄的Config資料夾,就會生成一個名稱為AppSet.config的配置檔案。如下圖:
由於Newlife本身也有一些配置類,所以也會自動生成在該目錄,習慣都放在一起,也可以通過類特性修改儲存路徑。開啟AppSet.config,內容如下:
1 <?xml version="1.0" encoding="utf-8"?> 2 <!--應用自定義配置--> 3 <AppSet> 4 <!--除錯開關。預設false--> 5 <Debug>false</Debug> 6 <!--每批次處理的資料記錄數--> 7 <BatchSize>20000</BatchSize> 8 <!--服務名稱--> 9 <ServiceName>TestName</ServiceName> 10 <!--快取清理時間--> 11 <CacheTime>2018-02-26 01:28:00</CacheTime> 12 <!--要監控的使用者ID列表--> 13 <UserList> 14 <!--要監控的使用者ID列表--> 15 <Int32>123</Int32> 16 <!--要監控的使用者ID列表--> 17 <Int32>23</Int32> 18 <!--要監控的使用者ID列表--> 19 <Int32>98</Int32> 20 <!--要監控的使用者ID列表--> 21 <Int32>38</Int32> 22 </UserList> 23 <!--鍵值對--> 24 <KvDemo> 25 <Comparer /> 26 <Count>3</Count> 27 <Keys> 28 <Count>3</Count> 29 </Keys> 30 <Values> 31 <Count>3</Count> 32 </Values> 33 </KvDemo> 34 </AppSet>
仔細對照上面類的設定,一目瞭然。所以做一個這樣的配置分分鐘的事情。這裡字典也支援,其實還支援類物件,可以把所有屬性都給配置進行。
就不一一演示了,下面我們看看配置如何動態生效。
3.3 配置動態生效
下面,我們來做一個小實驗,程式啟動後,間隔7s來讀取一次配置檔案(配置檔案3000毫秒檢測一次變化),然後手動到目錄下去修改配置檔案中的值,
程式碼如下:
XTrace.UseConsole(); while(true) { XTrace.WriteLine(AppSet.Current.ServiceName); //休眠7000毫秒,重新獲取 System.Threading.Thread.Sleep(7000); }
結果如下:
可以看到配置的服務名稱修改後,日誌打印出有更新,重新載入,並繼續打印出修改後的值。
4.底層原始碼實現
配置檔案泛型基類原始碼位置在 NewLife.Core/Xml/XmlConfig.cs ,對泛型的使用很常見,但對泛型基類使用出神入化,我見到最多的就是在X元件裡面。非常牛逼的一個東西,我只會其皮毛,作者@大石頭才是碼神。
由於該配置檔案基於XML檔案,所以有幾個輔助類。核新的程式碼主要是載入,和儲存等邏輯,和上面功能一直,如果想學習,建議程式碼down下來,除錯一遍。
5.相關資源
相關推薦
.NET平臺開源專案速覽(20)Newlife.Core中簡單靈活的配置檔案
如果用知乎,可以關注專欄: 記得5年前開始拼命翻讀X元件的原始碼,特別是XCode,但對Newlife.Core 的東西瞭解很少,最多隻是會用用,而且用到的只是九牛一毛。裡面好用的東西太多了。 最近一年時間,零零散散又學了很多,也瞭解了很多,不會寫那總要學會用吧,今天就給大家介紹裡面非常好用的自定義配置檔
.NET平臺開源專案速覽-最快的物件對映元件Tiny Mapper之專案實踐
心情小札:近期換了工作,苦逼於22:00後下班,房間一篇狼藉~ 小翠鄙視到:"你就適合生活在垃圾堆中!!!" 看評論也是挺有價值,同時也看到許多新手同學問道在實際專案中使用的情況。 下面就原作者的程式碼的基礎上略作調整,闡述一下在實際專案場景中的使用: 第一步:瞭解類庫方法:TinyMapper 主
.NET平臺開源專案速覽(14)最快的物件對映元件Tiny Mapper
好久沒有寫文章,工作甚忙,但每日還是關注.NET領域的開源專案。五一休息,放鬆了一下之後,今天就給大家介紹一個輕量級的物件對映工具Tiny Mapper:號稱是.NET平臺最快的物件對映元件。那就一起看看呢。 臨時更新:感謝@ 的意見,為了避免新手誤解,這裡說明一下,Tiny Mappe
.NET平臺開源專案速覽(19)Power BI神器DAX Studio
PowerBI更新頻繁,已經有點更不上的節奏,一直在關注和學習中,基本的一些操作大概是沒問題,更重要的是注重Power Query,M函式,以及DAX的使用,這才是核心。 上個月研究了DAX的一些語法和公式,發現這玩意看起來簡單,但其實功能非常強大,所以就想和寫程式碼一樣,弄個工具試一下。
.NET平臺開源專案速覽(21)Cron任務排程CronNET
Quartznet大名鼎鼎應該很少有人不知道,相關的開源專案很多,不過那東東對新手來說,有點晦澀,加上哪個Cron表示式,可能一進去雲裡霧裡的。今天給大家介紹一個簡單的在.NET平臺上執行Cron計劃任務的元件CronNET。同時也給大家推介幾個Cron表示式的工具。 1.Cron介紹和工具
.NET平臺開源專案速覽(7)關於NoSQL資料庫LiteDB的分頁查詢解決過程
在文章:這些.NET開源專案你知道嗎?讓.NET開源來得更加猛烈些吧!(第二輯) 與 .NET平臺開源專案速覽(3)小巧輕量級NoSQL檔案資料庫LiteDB中,介紹了LiteDB的基本使用情況以及部分技術細節,我還沒有在實際系統中大量使用,但文章釋出後,有不少網友( )反應在實際專案中使用過,效果還
.NET平臺開源專案速覽(11)KwCombinatorics排列組合使用案例(1)
今年上半年,我在KwCombinatorics系列文章中,重點介紹了KwCombinatorics元件的使用情況,其實這個元件我5年前就開始用了,非常方便,麻雀雖小五臟俱全。所以一直非常喜歡,才寫了幾篇文章推薦給大家。最近在計算足球彩票結果組合過程中,使用的到了其功能,生成排列,非常具有代表性,而且也
.NET平臺開源專案速覽(1)SharpConfig配置檔案讀寫元件
在.NET平臺日常開發中,讀取配置檔案是一個很常見的需求。以前都是使用System.Configuration.ConfigurationSettings來操作,這個說實話,搞起來比較費勁。不知道大家有沒有同感。所以更多時候我還是喜歡使用開源的東西,更加方便簡潔,也穩定。省去自己的麻煩。今天就介紹一個非常精緻
.NET平臺開源專案速覽(3)小巧輕量級NoSQL檔案資料庫LiteDB
今天給大家介紹一個不錯的小巧輕量級的NoSQL檔案資料庫LiteDB。本部落格在2013年也介紹過2款.NET平臺的開源資料庫: 上面2個數據庫我的實際的專案中用過,還不錯。當然資料量很小,主要是客戶比較變態,必須要用xml檔案儲存,就想到了,另外NDatabase只是自己覺得好玩,
.NET平臺開源專案速覽(9)軟體序列號生成元件SoftwareProtector介紹與使用
在文章:這些.NET開源專案你知道嗎?讓.NET開源來得更加猛烈些吧!(第二輯)中,給大家初步介紹了一下Software Protector序列號生成元件。今天就通過一篇簡單的文章來預覽一下其強大的功能。雖然我人為其已經基本滿足了一個軟體序列號的所有要素,但至於大家用不用得上,還得看大家的需求。總的來
.NET平臺開源專案速覽(10)FluentValidation驗證元件深入使用(二)
在上一篇文章:.NET平臺開源專案速覽(6)FluentValidation驗證元件介紹與入門(一) 中,給大家初步介紹了一下FluentValidation驗證元件的使用情況。文章從構建間的驗證器開始,到最後的結果,以及複雜驗證等都做了比較深入的講解和使用。但其實一個完整的元件是麻雀雖小五臟俱全
.NET平臺開源專案速覽(2)Compare .NET Objects物件比較元件
.NET平臺開源專案速覽今天介紹一款小巧強大的物件比較元件。可以更詳細的獲取2個物件的差別,並記錄具體差別,比較過程和要求可以靈活配置。 1.Compare .NET Objects介紹 Compare .NET Objects元件是.NET平臺用於深入比較2個.NET物件的開源元
.NET平臺開源專案速覽(13)機器學習元件Accord.NET框架功能介紹
Accord.NET Framework是在AForge.NET專案的基礎上封裝和進一步開發而來。因為AForge.NET更注重與一些底層和廣度,而Accord.NET Framework更注重與機器學習演算法以及提供計算機視訊、音訊、訊號處理以及統計應用相關的解決方案。該專案使用C#語言編寫,專
.NET平臺開源專案速覽(5)深入使用與擴充套件SharpConfig元件
上個月在文章:這些.NET開源專案你知道嗎?讓.NET開源來得更加猛烈些吧 和 .NET平臺開源專案速覽(1)SharpConfig配置檔案讀寫元件 中都提到了SharpConfig元件,簡單輕量級,速度快,而且還有比較深入的使用介紹。在文章釋出後,也有網友提到一些問題,當時我也沒仔細去分析,在這次我親
.NET平臺開源專案速覽(8)Expression Evaluator表示式計算元件使用
在文章:這些.NET開源專案你知道嗎?讓.NET開源來得更加猛烈些吧!(第二輯)中,給大家初步介紹了一下Expression Evaluator驗證元件。那裡只是概述了一下,並沒有對其使用和強大功能做深入研究,所以今天就通過一篇簡單的文章來預覽一下其強大的功能。本文曾在【原創】.NET開源表示式計算元
.NET平臺開源專案速覽(4).NET文件生成工具ADB及使用
很久以前就使用ADB這個工具來生成專案的幫助文件。功能強大,在學習一些開源專案的過程中,官方沒有提供CHM幫助文件,所以為了快速的瞭解專案結構和註釋。就生成文件來自己看,非常好用。這也是一個學習方法吧。例如本文在: 上述2篇文章中最後的資源中就手動製作了CHM幫助文件。有時候我們還可
.NET平臺開源專案速覽(6)FluentValidation驗證元件介紹與入門(一)
在文章:這些.NET開源專案你知道嗎?讓.NET開源來得更加猛烈些吧!(第二輯)中,給大家初步介紹了一下FluentValidation驗證元件。那裡只是概述了一下,並沒有對其使用和強大功能做深入研究,所以今天以及接下去的幾篇文章就專門介紹這個元件。不僅僅是它小,輕量級,優雅,而且一直在持續更新中
.NET平臺開源專案速覽(12)雜湊演算法集合類庫HashLib
.NET的System.Security.Cryptography名稱空間本身是提供加密服務,雜湊函式,對稱與非對稱加密演算法等功能。實際上,大部分情況下已經滿足了需求,而且.NET實現的都是目前國際上比較權威的,標準化的演算法,所以還是安全可靠的。但也有一些場合,需要自己實現一些安全雜湊演算法。
.NET平臺開源專案速覽(18)C#平臺JSON實體類生成器JSON C# Class Generator
去年,我在一篇文章用原始方法解析複雜字串,json一定要用JsonMapper麼?中介紹了簡單的JSON解析的問題,那種方法在當時的環境是非常方便的,因為不需要生成實體類,結構很容易解析。但隨著業務的變化,也會碰到超級變態的JSON,如果還按照以前的思路,會把人搞抽風掉,一旦結構變化,又要重來。所
.NET平臺開源專案速覽(16)C#寫PDF檔案類庫PDF File Writer介紹
1年前,我在文章:這些.NET開源專案你知道嗎?.NET平臺開源文件與報表處理元件集合(三)中(第9個專案),給大家推薦了一個開源免費的PDF讀寫元件 PDFSharp,PDFSharp我2年前就看過,用過簡單的例子,不過程式碼沒有寫成專門的文章。最近在查詢資料的時候,又發現一款小巧的寫PDF檔案