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

     

    完整代码下载

  • 相关阅读:
    checkbox 实现单选效果(html)
    HDU-6850 Game
    牛客练习赛29----F 算式子
    牛客多校第二场 B Boundary
    D. Omkar and Circle
    【洛谷】P3306 [SDOI2013]---- 随机数生成器
    二次剩余
    【洛谷】--P2704 [NOI2001]炮兵阵地
    【洛谷】4310 绝世好题
    快速排序
  • 原文地址:https://www.cnblogs.com/dataadapter/p/3546571.html
Copyright © 2020-2023  润新知