概述

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. CSS基础(五):定位

    CSS定位机制 CSS 有三种基本的定位机制:相对定位.浮动和绝对定位. 相对定位 相对定位指的是设置为相对定位的元素框会偏移某个距离.元素仍然保持其未定位前的形状,它原本所占的空间仍保留. 如果将b ...

  2. Linux下动态链接库 与gcc 选项

    -L 编译时查找动态链接库的路径 -lxxx(小写)  e.g -lcudart   = link libcudart.so  , -I(大写) 头文件的路径 -rpath (-R), 编译时指定链接 ...

  3. android studio ndk使用openMP

    好久没碰ndk了,之前都是在eclipse下写makefile配置c++程序的,现在发现主流都是用android studio,eclipse俨然已经被遗弃了,正好最近项目需要用openMP做算法加速 ...

  4. unix/linux中图形界面那些事

    我们知道unix/linux刚开始的时候是没有图形界面的,随着时代的发展,排版.制图.多媒体应用越来越普遍了,这些需求都需要用到图形界面(Graphical User Interface).为此,MI ...

  5. Linux 时钟与计时器

    对 Linux 系统来说,时钟和计时器是两个十分重要的概念.时钟反应的是绝对时间,也可认为是实时时间.计时器反应的则是相对时间,即相对于系统启动后的计时.操作系统内核需要管理运行时间(uptime)和 ...

  6. ArcGIS平台中PostgreSQL数据连接配置总结

    通常用户在使用要素服务时,要求数据必须是存放在空间数据库中的.同时,需要将数据库注册到ArcGIS for Server,这样在发布服务时就不需要进行数据拷贝,从而可以节省磁盘空间及服务发布时间.以下 ...

  7. CSS选择器、优先级与匹配原理

    为了分析Bootstrap源码,所以的先把CSS选择器相关的东东给巩固好 废话就不多说了 CSS 2.1 selectors, Part 1 计算指定选择器的优先级:重新认识CSS的权重 标签的权值为 ...

  8. UVa11292

    Problem C: The Dragon of Loowater Once upon a time, in the Kingdom of Loowater, a minor nuisance tur ...

  9. GET方法传递中文参数乱码解决办法

    1.在页面中对你的URL进行编码 使用------encodeURI(你要使用的中文参数值)如:...?username"+encodeURI(“小甜甜") 2.在后台通过解码来接 ...

  10. 在Eclipse中进行HotSpot的源码调试--转

    原文地址:http://www.linuxidc.com/Linux/2015-05/117250.htm 在阅读OpenJDK源码的过程中,经常需要运行.调试程序来帮助理解.我们现在已经可以编译出一 ...