zoukankan      html  css  js  c++  java
  • 自定义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 当程序第一次运行时,输出对应的配置信息 www.yz-lc.com
     
     
     2 当修改部分参数时,无需重启,即可获得最新的信息。注意,当修改参数3秒后,再刷新页面雅思答案 tygj123.com
     
     
     

  • 相关阅读:
    根据地球上两个坐标点,计算出距离
    判断一个日期距离今天是不是过了指定的天数
    二维码
    修改、删除 触发器
    sql server 数据加密
    C#下载apk文件
    java 判断一个字符串是否包含某个字符串中的字符
    CenterOS 设置静态IP
    VMware 克隆 CenterOS 虚拟机
    VMware 安装CenterOS
  • 原文地址:https://www.cnblogs.com/haosola/p/3584168.html
Copyright © 2011-2022 走看看