一個程序,免不了的一件事就是做運行時配置。.Net平台原生的配置就是使用App.config。但是這種方式配置起來並不十分的靈活,而且是文本文件,不適合存儲一些較為敏感的信息。
園子中也有很多博主發表過關於“快速配置文件”的文章,使用的是“序列化”和“反序列化”相關的知識。但是,僅僅給出了一個簡單的實現,並不能復用。由於我經常性的會遇到需要給軟件加一個配置文件的問題,於是就花費了一點時間,制作了一個QuickConfig組件,分享給大家。如果代碼什么的有不對的地方,歡迎大家指出。
先說說QuickConfig的特點:
- 基於貧血模型:如果你的程序已經有了配置文件,並且為這個配置做了一個實體類來方便管理,那么,如果要QuickConfig,您只需要做很少的變更即可。
- 實時更新配置:如果在軟件運行時,您手動修改了配置文件,那么這個修改是會立即反映到程序中的。
- 默認配置支持:任何一項配置,都會有一個默認值,對吧?
- 配置文件容錯:如果客戶不小心把配置文件搞丟了,或者弄壞了,那么軟件就不能運行了嗎?No,No,No。軟件可以基於默認配置繼續運行。
- 配置操作方便:可以隨時從文件中讀取配置,或者把配置保存,或者重置為默認值。(調用相應的方法即可)。
- 自定義序列化方式:組件默認提供XML序列化,您可以自己定義序列化方式。比如Json。
- 配置加密支持:通過自定義序列化方式,可以對流加密,自然就可以對配置文件加密。
- 自定義配置文件文件名:配置文件保存在程序的運行目錄,默認是一個以配置類全名為文件名的xml文件。您也可以自己定義文件名。
是不是有些心動了呢?下面就讓我們從實例入手吧!
首先,創建一個配置實體,定義好屬性后,在構造函數中,寫入配置默認值:(記得加入Serializable特性)

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組件到項目中。所有的准備工作就完成了,接着就可以使用啦。怎么用呢?很簡單。。。

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)

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特性,那么就會是這樣:

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中的代碼,讓其可以不斷的獲取配置:

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