|
在Web系統(tǒng)開發(fā)中,我們經(jīng)常需要讀取和設(shè)置一些系統(tǒng)配置項(xiàng),常見的例如數(shù)據(jù)庫(kù)連接字符串、上傳路徑等等。
在最初的ASP系統(tǒng)中,比較常用的方法是將值保存為Application或Session變量;在Asp.net系統(tǒng)中,目前比較常見的簡(jiǎn)單方法是把相應(yīng)的配置項(xiàng)寫入Web.Config中,例如
<?xml version="1.0" encoding="utf-8" ?> <configuration> <system.web> ... </system.web> <appSettings> <add key="ConnectionString" value="server=(local);database=dbname;uid=username;pwd=password"/> </appSettings> </configuration>
然后在程序中通過(guò)如下方式讀取
string connString = ConfigurationSettings.AppSettings["ConnectionString"];
這種方法在系統(tǒng)規(guī)模較小復(fù)雜度較低的時(shí)候也不失為一種簡(jiǎn)單明了的輕量級(jí)方法,不過(guò)如果系統(tǒng)較復(fù)雜,配置項(xiàng)會(huì)較多,同時(shí)我們需要按不同模塊對(duì)配置進(jìn)行劃分,并且還希望能以面向?qū)ο蠓椒▉?lái)對(duì)其進(jìn)行封裝,那么如果仍然采用這種過(guò)于簡(jiǎn)化方式就不太合時(shí)宜了。
-----------------------------------------------------------------
下面,我講述一下通過(guò)XML類序列化解決系統(tǒng)配置問題的方法。
關(guān)于XML類序列化和反序列化(另外一種描述是串行化和并行化)的技術(shù)細(xì)節(jié),大家可以查看MSDN了解;這里簡(jiǎn)單講兩句,XML序列化是把一個(gè)對(duì)象序列化到XML文檔的過(guò)程,反序列化則是從XML輸出中重新創(chuàng)建原始狀態(tài)的對(duì)象。
直觀表現(xiàn)就是如下圖模式
看了這個(gè)圖,就很清楚了,通過(guò)序列化,可以采用面向?qū)ο蟮姆椒,非常自然和方便的讀取和設(shè)置系統(tǒng)配置;.NET Framework承擔(dān)了對(duì)象和XML文件映射工作,我們只需要簡(jiǎn)單的使用就OK。下面我們講一下具體內(nèi)容。
上面圖示已經(jīng)表明,首先需要一個(gè)XML配置文件,格式內(nèi)容如上圖,具體配置項(xiàng)可以自行增減。
然后我們需要編寫一個(gè)類,如上圖所示;特殊的一點(diǎn),為了使類能夠?qū)崿F(xiàn)XML序列化,需要在類的所有屬性聲明前添加屬性信息XmlElement,如下所示。
[XmlElement] public string ConnectionString { get { return connectionString; } set { connectionString = value; } }
由于AppConfig類本身沒有實(shí)現(xiàn)方法,因此我們需要一個(gè)配置類AppConfigSetting.cs。類的結(jié)構(gòu)很簡(jiǎn)單,只需要兩個(gè)靜態(tài)方法,Get()獲取AppConfig對(duì)象,Save()保存AppConfig對(duì)象。
另外,我們需要在 Web.Config中添加該XML配置文件的地址。
<appSettings> <add key="AppConfigPath" value="/FilePath/file.config"/> </appSettings>
public class AppConfigSetting { //獲取配置對(duì)象 public static AppConfig Get() { //嘗試獲取緩存中的對(duì)象 AppConfig config = (AppConfig)HttpContext.Current.Cache["AppConfig"]; //如果緩存中沒有該配置對(duì)象,則直接獲取對(duì)象 if (config == null) { //新建序列化對(duì)象并指定其類型 XmlSerializer serial = new XmlSerializer(typeof(AppConfig)); try { string file = HttpContext.Current.Server.MapPath(GetFile()); //讀取文件流 FileStream fs = new FileStream(file, FileMode.Open); //文件流反序列化為對(duì)象 config = (AppConfig)serial.Deserialize(fs); fs.Close(); //將對(duì)象加入到緩存中 HttpContext.Current.Cache.Insert("AppConfig", config, new CacheDependency(file)); } catch (System.IO.FileNotFoundException) { config = new AppConfig(); } } return config; } //保存配置對(duì)象 public static void Save(AppConfig config) { string file = HttpContext.Current.Server.MapPath(GetFile()); XmlSerializer serial = new XmlSerializer (typeof(AppConfig)); FileStream fs = new FileStream(file, FileMode.Create); //對(duì)象序列化為文件 serial.Serialize(fs, config); fs.Close(); } //獲取配置文件路徑 private static string GetFile() { string path = (string)HttpContext.Current.Cache["FilePath"]; if (path == null) { path=ConfigurationSettings.AppSettings["AppConfigPath"]; HttpContext.Current.Cache["FilePath"] = path; } return path; } }
類的使用非常簡(jiǎn)單,基本方式如下
//代碼僅為使用演示 AppConfig config = AppConfigSetting.Get(); string connString = config.ConnectionString; ... config.ConnectionString = connString; AppConfigSetting.Save(config);
看到這樣的代碼,不禁有令人賞心悅目之感;相對(duì)于原來(lái)的直接讀取AppSetting,可謂解脫矣! :)
OK,就此結(jié)束了。這篇文章只涉及對(duì)象序列化的非常簡(jiǎn)單的應(yīng)用,沒有涉及太多的技術(shù)原理和細(xì)節(jié),大家要深入了解請(qǐng)參考MSDN。
希望文章能對(duì)大家有所補(bǔ)益和啟發(fā)。 :)
|
溫馨提示:喜歡本站的話,請(qǐng)收藏一下本站!