【小玩意兒】使用C#的“貧血模型”快速配置組件QuickConfig


一個程序,免不了的一件事就是做運行時配置。.Net平台原生的配置就是使用App.config。但是這種方式配置起來並不十分的靈活,而且是文本文件,不適合存儲一些較為敏感的信息。

園子中也有很多博主發表過關於“快速配置文件”的文章,使用的是“序列化”和“反序列化”相關的知識。但是,僅僅給出了一個簡單的實現,並不能復用。由於我經常性的會遇到需要給軟件加一個配置文件的問題,於是就花費了一點時間,制作了一個QuickConfig組件,分享給大家。如果代碼什么的有不對的地方,歡迎大家指出。

先說說QuickConfig的特點:

  1. 基於貧血模型:如果你的程序已經有了配置文件,並且為這個配置做了一個實體類來方便管理,那么,如果要QuickConfig,您只需要做很少的變更即可。
  2. 實時更新配置:如果在軟件運行時,您手動修改了配置文件,那么這個修改是會立即反映到程序中的。
  3. 默認配置支持:任何一項配置,都會有一個默認值,對吧?
  4. 配置文件容錯:如果客戶不小心把配置文件搞丟了,或者弄壞了,那么軟件就不能運行了嗎?No,No,No。軟件可以基於默認配置繼續運行。
  5. 配置操作方便:可以隨時從文件中讀取配置,或者把配置保存,或者重置為默認值。(調用相應的方法即可)。
  6. 自定義序列化方式:組件默認提供XML序列化,您可以自己定義序列化方式。比如Json。
  7. 配置加密支持:通過自定義序列化方式,可以對流加密,自然就可以對配置文件加密。
  8. 自定義配置文件文件名:配置文件保存在程序的運行目錄,默認是一個以配置類全名為文件名的xml文件。您也可以自己定義文件名。

是不是有些心動了呢?下面就讓我們從實例入手吧!

首先,創建一個配置實體,定義好屬性后,在構造函數中,寫入配置默認值:(記得加入Serializable特性)

AppConfig.cs
 1     [Serializable]
 2     public class AppConfig
 3     {
 4         public AppConfig()
 5         {
 6             this.AppName = "Brain Burst";
 7             this.UpdateInterval = 1;
 8             this.MainWindowSize = new Size(800, 600);
 9         }
10         /// <summary>
11         /// 應用程序名稱
12         /// </summary>
13         public String AppName { get; set; }
14         /// <summary>
15         /// 更新間隔 單位:小時
16         /// </summary>
17         public Int32 UpdateInterval { get; set; }
18         /// <summary>
19         /// 主窗體大小
20         /// </summary>
21         public Size MainWindowSize { get; set; }
22     }

引入QuickConfig組件到項目中。所有的准備工作就完成了,接着就可以使用啦。怎么用呢?很簡單。。。

Program.cs
 1     class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             var cfm = QuickConfigManagement<AppConfig>.Create();
 6             Console.Write(cfm.ConfigModel.AppName);
 7             Console.WriteLine(cfm.ConfigModel.MainWindowSize.ToString());
 8             Console.ReadLine();
 9         }
10     }

是不是真的很簡單?簡單到要爆掉?。。嘿嘿,還有更精彩的。我們可以使用QuickConfigArgumentAttribute特性來設置配置文件的文件名以及序列化方式。

首先,我們先做一個Json序列化的實現(實現IQuickConfigProvider接口):(引用Json.Net)

JsonQuickConfigProvider.cs
 1     public class JsonQuickConfigProvider : QuickConfig.IQuickConfigProvider
 2     {
 3         public Type ConfigType { get; set; }
 4 
 5         public object Deserialize(System.IO.Stream stream)
 6         {
 7             JsonSerializer js = new JsonSerializer();
 8             return js.Deserialize(new System.IO.StreamReader(stream), this.ConfigType);
 9         }
10 
11         public void Serialize(System.IO.Stream stream, object config)
12         {
13             JsonSerializer js = new JsonSerializer();
14             var sw = new System.IO.StreamWriter(stream);
15             js.Serialize(sw, config);
16             sw.Flush();
17         }
18     }

然后,給AppConfig類加入QuickConfigArgumentAttribute特性,那么就會是這樣:

AppConfig.cs
 1     [Serializable]
 2     [QuickConfigArgument("config.json",typeof(JsonQuickConfigProvider))]
 3     public class AppConfig
 4     {
 5         public AppConfig()
 6         {
 7             this.AppName = "Brain Burst";
 8             this.UpdateInterval = 1;
 9             this.MainWindowSize = new Size(800, 600);
10         }
11         /// <summary>
12         /// 應用程序名稱
13         /// </summary>
14         public String AppName { get; set; }
15         /// <summary>
16         /// 更新間隔 單位:小時
17         /// </summary>
18         public Int32 UpdateInterval { get; set; }
19         /// <summary>
20         /// 主窗體大小
21         /// </summary>
22         public Size MainWindowSize { get; set; }
23     }

這樣的話,運行程序,就會產生一個config.json的文件:

現在我們修改一下Program.cs中的代碼,讓其可以不斷的獲取配置:

Program.cs
 1     class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             var cfm = QuickConfigManagement<AppConfig>.Create();
 6             while (true)
 7             {
 8                 Console.Write(cfm.ConfigModel.AppName);
 9                 Console.WriteLine(cfm.ConfigModel.MainWindowSize.ToString());
10                 var key = Console.ReadLine();
11                 if (String.Equals(key, "exit")) break;
12             }
13         }
14     }

接着,運行程序:

使用Notepad++打開config.json文件。修改其中的內容:

可以看到,我們將AppNamde的值,修改為Soar Brain Burst。現在,回到程序,按下回車后:

可以看到,程序讀出的值已經刷新了。(我向你保證,不是每次訪問配置實體的屬性時都會重新讀取一遍配置文件)

來試試“重新載入”和“恢復默認值”吧:

重新載入
 1     class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             var cfm = QuickConfigManagement<AppConfig>.Create();
 6             Console.WriteLine(cfm.ConfigModel.AppName);//Soar Brain Burst
 7             cfm.ConfigModel.AppName = "New App Name";  //設置新值
 8             cfm.Load();//重新載入配置文件
 9             Console.WriteLine(cfm.ConfigModel.AppName);//Soar Brain Burst
10         }
11     }
恢復默認值
 1     class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             var cfm = QuickConfigManagement<AppConfig>.Create();
 6             Console.WriteLine(cfm.ConfigModel.AppName);//Soar Brain Burst
 7             cfm.Reset();//配置設為默認值
 8             Console.WriteLine(cfm.ConfigModel.AppName);//Brain Burst
 9             /*
10              * 在調用Reset之后,
11              * 實體配置並不會被寫入配置文件。
12              * 要想寫入配置文件,
13              * 需要調用Save方法。
14              */
15             cfm.Save();
16         }
17     }

長出一口氣。終於完成了。這是我第一次在博客園中分享自己寫的組件,如果大家有什么意見,歡迎提出。QuickConfig的下載地址是:http://files.cnblogs.com/Soar1991/QuickConfig.7z

由於一些原因,文件中只有組件,沒有例子,勞煩大家手敲吧。(*^__^*) 嘻嘻。喜歡的話,勞煩大家給個支持。謝謝~!


免責聲明!

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



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