您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關如何自定義XML動態配置程序的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
概述
1 在做程序開發時,我們往往要用到如下兩個基本模塊
1> 設置程序的基礎參數,如分頁的參數、郵件參數等;
2> 在基于表驅動開發時,即把一些判斷的邏輯放在表數據中;
2 在這兩個基本應該中,我們有如下的需求:
1> 要集中管理;
2> 要可配置,即不重起系統的情況下,修改參數;
3> 易于使用。
程序的主要功能
1> 設置程序的基礎參數,如分頁的參數、郵件參數等;
----將XML中配置信息自動加到對應的實體上。
2> 在基于表驅動開發時,即把一些判斷的邏輯放在表數據中;
----將XML中的Dctionary 數據自動加載到對應的實體上。但此方法需要繼續優化,現在僅支持加載Dictionary,需要支持更復雜的結構。
主要代碼
1 首先定義,在代碼中引用實體。
示例
public class AppSetting { public string PageSize; public string WebUrl; public Dictionary<string, string> IsPartialPayment; public Dictionary<string, string> EntityCurrency; }
2 定義與之對應的XML文件。 其中,程序的基本配置信息配置在AppSettings
節點下面。
<?xml version="1.0" encoding="utf-8" ?> <settings> <DictSettings> <Dict name="AppSettings" > <add key="PageSize" value="2"></add> <add key="WebUrl" value="www.baidu.com"></add> </Dict> <Dict name="IsPartialPayment"> <add key="TTPART" value="true"></add> <add key="TT50/50" value="true"></add> </Dict> <Dict name="EntityCurrency"> <add key="China" value="CNY"></add> <add key="HQ" value="USD"></add> <add key="Default" value="USD"></add> </Dict> </DictSettings> </settings>
3 最后需要一段XML加載代碼,把2中的XML配置信息加載到1 中的實體中去。
public static class ConfigManager { public static AppSetting AppSetting; private static string xmlPath; public static Dictionary<string, Dictionary<string, string>> DictAppSettings = new Dictionary<string, Dictionary<string, string>>(); static ConfigManager() { xmlPath = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory.ToString(), "AppConfig.xml"); LoadSettings(xmlPath); } private static void LoadSettings(string path) { DictAppSettings.Clear(); //加載XML中所有的key,value,并轉換成Dictionary對象 XmlNode dictRootNode = FileHelper.GetXMLNode(path, "/settings/DictSettings"); foreach (XmlNode dictType in dictRootNode.ChildNodes) { Dictionary<string, string> dict = new Dictionary<string, string>(); foreach (XmlNode dictItem in dictType.ChildNodes) { dict.Add(dictItem.Attributes["key"].Value.Trim(), dictItem.Attributes["value"].Value.Trim()); } DictAppSettings.Add(dictType.Attributes["name"].Value.Trim(), dict); } //將Dictionary 對象轉換成實體的字段和對應dctionary上 var serializer = new JavaScriptSerializer(); //將AppSettings轉成json string jAppSetting = serializer.Serialize(DictAppSettings["AppSettings"]); DictAppSettings.Remove("AppSettings"); //將除AppSettings中的信息轉成json string jDict = serializer.Serialize(DictAppSettings); //將AppSettings和其它的Dictionary 加載到對應的實體中去。 string json = string.Format("{0},{1}", jAppSetting.Remove(jAppSetting.Length - 1), jDict.Remove(0, 1)); AppSetting = serializer.Deserialize<AppSetting>(json); //當修改文件時,重新加載XML FileHelper.CacheDependencyFile(path, CacheRemovedCallback); } private static void CacheRemovedCallback(string key, object value, CacheItemRemovedReason reason) { //此方法來自Fish.Li string xmlFilePath = (string)value; // 由于事件發生時,文件可能還沒有完全關閉,所以只好讓程序稍等。 System.Threading.Thread.Sleep(3000); LoadSettings(xmlFilePath); } } public static class FileHelper { public static XmlNode GetXMLNode(string path, string xPath) { XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(path); return xmlDoc.SelectSingleNode(xPath); } public static void CacheDependencyFile(string path, CacheItemRemovedCallback removedCallback) { CacheDependency dep = new CacheDependency(path); HttpRuntime.Cache.Insert(Guid.NewGuid().ToString(), path, dep, Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration, CacheItemPriority.NotRemovable, removedCallback); } }
最終效果
1 當程序第一次運行時,輸出對應的配置信息
2 當修改部分參數時,無需重啟,即可獲得最新的信息。注意,當修改參數3秒后,再刷新頁面
感謝各位的閱讀!關于“如何自定義XML動態配置程序”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。