首页 > 学院 > 开发设计 > 正文

自定义XML动态配置程序

2019-11-17 03:21:47
字体:
来源:转载
供稿:网友

自定义xml动态配置程序

2014-02-12 20:33 by Mike.Jiang, ... 阅读, ... 评论, 收藏, 编辑

概述

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秒后,再刷新页面

完整代码下载


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表