概述

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. debian+apache+acme_tiny+lets-encrypt配置笔记

    需要预先将需要申请ssl的域名指向到服务器,此方法完全通过api实现,好处是绿色无污染,不需要注册账号,不会泄露私人信息环境为 debian7+apache apt-get install apach ...

  2. POJ 2083 Fractal

    Fractal Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 6646   Accepted: 3297 Descripti ...

  3. [转]非OpenVZ下利用谷歌TCP-BBR协议单边加速你的VPS

    前段时间谷歌推出了新的 TCP-BBR 开源算法,可以起到单边加速 TCP 连接的效果,也就是不用客户端的配合,用来替代收费的锐速再合适不过,毕竟开源免费.TCP-BBR 的目的是要尽量跑满带宽,并且 ...

  4. oracle/sqlserver 递归

    1.Oracle递归查询 2.SqlServer递归查询 with cte as ( select t.id,t.name,t.parentId from dbo.Department t where ...

  5. 互联网金融必须知道:O2O、P2P、MRD、BRD、LBS、PV、UV、KPI、MRD、VP、UED....

    进入互联网的朋友们和身为互联网业内人士,你们知道有多少专业术吗?有时候专业术语也是一种逼格.商业需求文档,市场需求文档,产品需求文档,功能详细说明文档,华丽丽的各种文档你知道吗?用户体验,用户界面,用 ...

  6. Linux命令:ps / top

    简介:ps - report a snapshot of the current processes. 用途:获取当前时刻程序运行状态 概要:ps [options] 类型:ps is hashed ...

  7. 使用WinDbg调试SQL Server查询

    上一篇文章我给你介绍了WinDbg的入门,还有你如何能附加到SQL Server.今天的文章,我们继续往前一步,我会向你展示使用WinDbg调试SQL Server查询需要的步骤.听起来很有意思?我们 ...

  8. ASP.NETC#通用扩展函数之TypeParse 类型转换方便多了

    用法: var int1 = "2".TryToInt();//转换为int失败返回0 var int2 = "2x".TryToInt(); var int3 ...

  9. PHP如何将进程作为守护进程

    看了这篇:http://blog.codinglabs.org/articles/write-daemon-with-php.html 对里面的posix_setsid()不解 文档解释是" ...

  10. IOS开发UI基础 UIDatePicker的属性

    UIDatePicker        •    Locale设置DatePicker的地区,即设置DatePicker显示的语言.// 1.跟踪所有可用的地区,取出想要的地区    NSLog(@& ...