.NET平台開源項目速覽(20)Newlife.Core中簡單靈活的配置文件


如果用知乎,可以關注專欄:.NET開源項目

記得5年前開始拼命翻讀X組件的源碼,特別是XCode,但對Newlife.Core 的東西了解很少,最多只是會用用,而且用到的只是九牛一毛。里面好用的東西太多了。

最近一年時間,零零散散又學了很多,也了解了很多,不會寫那總要學會用吧,今天就給大家介紹里面非常好用的自定義配置文件用法。

X組件的介紹我就不多說了,看這里多年前系列文章:

說明:文章是多年前的,但這些年變動也很大,最好看看源碼,基本用法都還差不多。

.NET開源文章目錄:本博客.NET開源項目文章目錄

本文原文地址:.NET平台開源項目速覽(20)Newlife.Core中簡單靈活的配置文件

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.相關資源

Newlife組件地址:https://github.com/NewLifeX/X

本文演示代碼地址:https://github.com/asxinyu/NewlifeDemo


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM