概述

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 - ), jDict.Remove(, ));
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(); 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动态配置程序的更多相关文章

  1. Winform中自定义xml配置文件,并配置获取文件路径

    场景 在Winform程序中,需要将一些配置项存到配置文件中,这时就需要自定义xml的配置文件格式.并在一些工具类中去获取配置文件的路径并加载其内容. 关注公众号霸道的程序猿获取编程相关电子书.教程推 ...

  2. IK-Analyzer(5.3.1)动态配置自定义词典

    参考文献:http://blog.csdn.net/fatpanda/article/details/37911079 jar包: IK-Analyzer-extra-5.3.1.jar IKAnal ...

  3. Winform中实现读取xml配置文件并动态配置ZedGraph的RadioGroup的选项

    场景 Winform中对ZedGraph的RadioGroup进行数据源绑定,即通过代码添加选项: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/ ...

  4. JavaWeb_(Struts2框架)struts.xml核心配置、动态方法调用、结果集的处理

    此系列博文基于同一个项目已上传至github 传送门 JavaWeb_(Struts2框架)Struts创建Action的三种方式 传送门 JavaWeb_(Struts2框架)struts.xml核 ...

  5. 4、android xml中drawableTop(drawableBoottom、drawableLeft、drawableRight)在java代码中的动态配置

    做安卓开发的朋友都知道,我们在xml中可以通过这样来对button设置其上部或者(下.左.右)的图片资源: 那么如果需要动态配置图片呢?我们不得不使用java代码来进行操作: Drawable dra ...

  6. 在MFC程序中使用XML文件配置工具栏

    现在我发现使用Visual Studio的资源编辑器进行编辑资源有着诸多的不便:首先是任何资源的变动一般变动代码,不利于系统维护,其次Visual Studio的资源编辑器的本身的功能有限,也不利于界 ...

  7. 【spring源码学习】spring的IOC容器之自定义xml配置标签扩展namspaceHandler向IOC容器中注册bean

    [spring以及第三方jar的案例]在spring中的aop相关配置的标签,线程池相关配置的标签,都是基于该种方式实现的.包括dubbo的配置标签都是基于该方式实现的.[一]原理 ===>sp ...

  8. 使用java代码动态配置与xml文件结合的方式使用mybatis-generator生成代码配置

    1.使用java代码动态配置与xml文件结合的方式使用mybatis-generator生成代码配置 2.上代码:在resources目录下新建:generatorConfiguration.xml文 ...

  9. 微信小程序动态修改title,动态配置title,动态配置头部,微信小程序动态配置头部

    微信小程序的title是在json里面配置的 "navigationBarTitleText": "title名称" 这种title是固定死的不灵活处理一些页面 ...

随机推荐

  1. WPF常用控件样式集锦

    1.不规则形状按钮(通过更改path实现) <Style x:Key="ButtonStyleForPath" TargetType="{x:Type Button ...

  2. lxde桌面默认快捷键

    ctrl+alt+左右      选择左右桌面shift+alt+左右     当前窗口送至左右桌面房子键+F1~F4       切换桌面1-4房子键+d           显示桌面alt+esc ...

  3. sublime返回上一编辑位置

    用了sublime好长时间了,最近发现一个python插件可以在编辑的时候返回上一编辑位置,这个功能在eclipse很常用,现在终于能在sublime上使用了.好爽. 贴个地址:https://for ...

  4. DSP中CMD文件

    DSP中CMD文件 (2012-12-26 20:54:17) 转载▼ 标签: 杂谈 分类: DSP FPGA DSP的存储器的地址范围,CMD是主要是根据那个来编的.CMD 它是用来分配rom和ra ...

  5. Eclipse项目名出现红叉

    一.背景与原因 项目第一次加进来的时候,我用的是D:\Java\jdk1.7.0_17,后来由于配置将tomcat切换到jboss,说是JBOSS某个版本只支持jdk6,我就将“环境变量JAVA_HO ...

  6. android sqlite导入数据

    @Override public void onUpgrade(SQLiteDatabase db, int arg1, int arg2) { // TODO Auto-generated meth ...

  7. 正确理解静态Static关键字

    与其他语言不通,C#没有全局变量和全局函数的感念,C#的所有字段和方法都出现在一个类的上下文中,在C#中与全局字段或函数等价的就是静态字段或方法.“全局字段或方法”与“C#的静态字段或方法”没有功能上 ...

  8. 2014 网选 上海赛区 hdu 5047 Sawtooth

    题意:求n个'M'型的折线将一个平面分成的最多的面数! 思路:我们都知道n条直线将一个平面分成的最多平面数是 An = An-1 + n+1 也就是f(n) = (n*n + n +2)/2 对于一个 ...

  9. 【原创】C#搭建足球赛事资料库与预测平台(2) 数据库与XCode组件

            本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 开源C#彩票数据资料库系列文章总目录:[目录]C#搭建足球赛事资料库与预测平台与彩票数据分析目录  本篇文章开始将逐步 ...

  10. 移除了css框架,世界干净了

    在之前的webapp项目里,我使用了bootstrap作为三方的css库,只调取了其中一部分源码的less使用,大部分代码仍然是自己写的. 自己的代码也是参照bootstrap的目录结构和它的一些规范 ...