概述
1 在做程序开发时,我们往往要用到如下两个基本模块
1> 设置程序的基础参数,如分页的参数、邮件参数等;
2> 在基于表驱动开发时,即把一些判断的逻辑放在表数据中;
2 在这两个基本应该中,我们有如下的需求:
1> 要集中管理;
2> 要可配置,即不重起系统的情况下,修改参数;
3> 易于使用。
程序的主要功能
1> 设置程序的基础参数,如分页的参数、邮件参数等;
----将XML中配置信息自动加到对应的实体上。
2> 在基于表驱动开发时,即把一些判断的逻辑放在表数据中;
----将XML中的Dctionary 数据自动加载到对应的实体上。但此方法需要继续优化,现在仅支持加载Dictionary,需要支持更复杂的结构。
免费的开源程序长期以来,为中国的网上交易提供免费开源的网上商店系统一直是我们的初衷和努力奋斗的目标,希望大家一起把MvMmall网上商店系统的免费开源进行到底。2高效的执行效率由资深的开发团队设计,从系统架构,数据库优化,配以通过W3C验证的面页模板,全面提升页面显示速度和提高程序负载能力。3灵活的模板系统MvMmall网店系统程序代码与网页界面分离,灵活的模板方案,完全自定义模板,官方提供免费模
主要代码
1 首先定义,在代码中引用实体。
示例
public class AppSetting
{
public string PageSize;
public string WebUrl;
public Dictionary IsPartialPayment;
public Dictionary EntityCurrency;
} 2 定义与之对应的XML文件。 其中,程序的基本配置信息配置在AppSettings
节点下面。
3 最后需要一段XML加载代码,把2中的XML配置信息加载到1 中的实体中去。
public static class ConfigManager
{
public static AppSetting AppSetting;
private static string xmlPath;
public static Dictionary> DictAppSettings = new Dictionary>();
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 dict = new Dictionary();
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(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秒后,再刷新页面










