电脑故障

位置:IT落伍者 >> 电脑故障 >> 浏览文章

通过Cache实现通用的配置管理


发布日期:2022/6/2
 

Net Web应用程序提供了很强大的 WebConfig功能我们很多的系统可能已经习惯在WebConfig中进行配置可是使用WebConfig进行一些配置会有一些不太顺畅的特性比如修改WebConfig 后Web应用程序会出现错误页面并且需要重新登录WebConfig配置过程不是很方便即使通过安装包进行WebConfig的设置Net 安装向导能提供的入口也是有限的

通过Cache机制实现一个通用的配置管理模块

设计目标

高速读取配置信息

统一的配置维护管理方便进行配置

新的配置模块及维护不需要再进行二次开发

大致设计思路

通过Cache机制对配置文件的内容进行缓存缓存的失效依赖于配置文件

在开发基础组件库中实现一个 CacheHelper 类统一读取配置信息

根据配置文件自动生成配置维护界面实现统一的配置维护

代码参考

CacheHelpercs 统一读取配置信息的一个类 打开配置文件读取相关的配置信息到HashTable 并保存到 Cache中Cache中存在则直接取Cache中的内容否则重新读取文件这样做到高速读取

using System;

using SystemCollections;

using SystemWeb;

using SystemWebCaching;

using SystemXml;

namespace EpowerDevBaseBaseTools

{

/// <summary>

/// ConfigHelper 的摘要说明

/// 自定义的系统参数配置文件的读取工具类

/// </summary>

public class ConfigHelper

{

/// <summary>

/// 取~/Config/CommonConfigxml中某个参数名对应的参数值

/// </summary>

/// <param name=ParameterName>参数名</param>

/// <returns>参数值</returns>

public static string GetParameterValue(string ParameterName)

{

return GetParameterValue(EpowerConfig ParameterName);

}

/// <summary>

/// 取某个参数配置文件中某个参数名对应的参数值

/// 参数配置文件

///必须存放于~/Config/目录下面xml为后缀

///配置格式参见~/Config/CommonConfigxml

/// </summary>

/// <param name=ConfigName>配置文件的文件名不要后缀</param>

/// <param name=ParameterName>参数名</param>

/// <returns>参数值</returns>

public static string GetParameterValue(string ConfigName string ParameterName)

{

Hashtable CommonConfig = GetConfigCache(ConfigName);

if (CommonConfigContainsKey(ParameterName))

return CommonConfig[ParameterName]ToString();

else

throw new Exception(参数( + ParameterName + )没有定义请检查配置文件!);

}

/// <summary>

/// 将配置的参数转换成Hashtable并存入缓存配置文件修改后自动更新缓存

/// </summary>

/// <param name=ConfigName></param>

/// <returns></returns>

private static Hashtable GetConfigCache(string ConfigName)

{

string CacheName = Config_ + ConfigName;

Hashtable CommonConfig = new Hashtable();

Cache cache = HttpRuntimeCache;

if (cache[CacheName] == null)

{

string ConfigPath = null;

#region 取应用程序根物理路径

try

{

ConfigPath = HttpRuntimeAppDomainAppPath;

}

catch (SystemArgumentException ex)

{

}

if (ConfigPath == null) throw new Exception(系统异常取不到应用程序所在根物理路径!);

#endregion

string ConfigFile = ConfigPath + Config\\ + ConfigName + xml;

XmlDocument xmlDoc = new XmlDocument();

xmlDocLoad(ConfigFile);

XmlNode oNode = xmlDocDocumentElement;

if (oNodeHasChildNodes)

{

XmlNodeList oList = oNodeChildNodes;

for (int i = ; i < oListCount; i++)

{

CommonConfigAdd(oList[i]Attributes[Name]Value oList[i]Attributes[Value]Value);

}

}

cacheInsert(CacheName CommonConfig new CacheDependency(ConfigFile));

}

else

CommonConfig = (Hashtable) cache[CacheName];

return CommonConfig;

}

}

}

代码参考

frmConfigSetaspx 以配置文件名为参数根据配置文件自动生成维护界面并进行维护保存

HtmlTable tab = new HtmlTable();

tabID = tDynamic;

tabAttributesAdd(width %);

tabAttributesAdd(class tablebody);

HtmlTableRow tr = new HtmlTableRow();

HtmlTableCell tc = new HtmlTableCell();

XmlNodeList nodes = xmldocDocumentElementSelectNodes(Item);

string sConfigContent = ;

if (xmldocDocumentElementAttributes[ConfigContent] != null)

sConfigContent = xmldocDocumentElementAttributes[ConfigContent]Value;

string sItemDesc = ;

int iRow = ;

foreach (XmlNode node in nodes)

{

iRow++;

tr = new HtmlTableRow();

trID = tDynamicRow + iRow;

AddControlByNode(nodeiRowref tr);

AddControl(tab tr);

sItemDesc = ;

if (nodeAttributes[ItemContent] != null)

sItemDesc = nodeAttributes[ItemContent]Value;

if (sItemDescLength > )

{

//添加描述行

iRow++;

tr = new HtmlTableRow();

trID = tDyContectRow + iRow;

tc = new HtmlTableCell();

tcID = tDyContectTD_ + iRow;

tcInnerText = sItemDesc;

tcAttributesAdd(class list);

tcAttributesAdd(colspan );

AddControl(tr tc);

AddControl(tab tr);

}

}

/// <summary>

///获取设置的控件

/// </summary>

/// <param name=node></param>

/// <returns></returns>

private Control GetSettingControl(XmlNode node)

{

string strCtrlType = nodeAttributes[ControlType]Value;

string strValue = nodeAttributes[Value]Value;

Control control;

switch (strCtrlTypeToLower())

{

case text:

control = new TextBox();

controlID = tDynamic + _txt_ + nodeAttributes[Name]Value;

((TextBox)control)Width = new Unit(%);

((TextBox)control)AttributesAdd(Tag nodeAttributes[Name]Value);

((TextBox)control)Text = strValue;

break;

case checkbox:

control = new CheckBox();

controlID = tDynamic + _chk_ + nodeAttributes[Name]Value;

((CheckBox)control)AttributesAdd(Tag nodeAttributes[Name]Value);

((CheckBox)control)Text =nodeAttributes[Desc]Value;

if (strValueToLower() == false)

{

((CheckBox)control)Checked = false;

}

else

{

((CheckBox)control)Checked = true;

}

break;

case droplist:

control = new DropDownList();

controlID = tDynamic + _drp_ + nodeAttributes[Name]Value;

((DropDownList)control)AttributesAdd(Tag nodeAttributes[Name]Value);

((DropDownList)control)Width = new Unit(%);

string[] sItems = nodeAttributes[Dict]ValueSplit(ToCharArray());

for (int i = ; i < sItemsLength; i++)

{

string[] arr = sItems[i]Split(|ToCharArray());

((DropDownList)control)ItemsAdd(new ListItem(arr[] arr[]));

}

((DropDownList)control)SelectedValue = strValue;

break;

case datetime:

control = (EpowerITSMWebControlsCtrDateAndTime)LoadControl(~/controls/ctrdateandtimeascx);

((EpowerITSMWebControlsCtrDateAndTime)control)ShowTime = false;

controlID = tDynamic + _date_ + nodeAttributes[Name]Value;

((EpowerITSMWebControlsCtrDateAndTime)control)AttributesAdd(Tag nodeAttributes[Name]Value);

break;

default:

control = null;

break;

}

return control;

}

配置文件范例

读取配置信息范例

string sSmtpServer = ConfigHelperGetParameterValue(EmailConfigsmtpserver);

<?xml version= encoding=utf?>

<EmailConfig Title=邮件服务设置 ConfigContent=邮件服务器设置服务器设置服务器设置服务器设置服务器设置服务器设置服务器设置>

<Item Name=smtpserver Value= Desc=邮件SMTP服务器 ControlType=TEXT ItemContent=设置邮件SMTP服务器的地址格式:>

</Item>

<Item Name=smtpfrom Value=c Desc=邮件地址 ControlType=TEXT ValidationExpression=^\w+((\w+)|(\\w+))*\@[AZaz]+((\|)[AZaz]+)*\[AZaz]+$>

</Item>

<Item Name=smtpUserName Value=cancankf Desc=帐户 ControlType=TEXT>

</Item>

<Item Name=smtppsd Value= Desc=密码 ControlType=TEXT>

</Item>

<Item Name=smtpSSL Value=false Desc=是否SSL ControlType=CHECKBOX>

</Item>

<Item Name=smtpPort Value= Desc=端口 ControlType=TEXT ValidationExpression=\d{}>

</Item>

<Item Name=smtpDateTest Value= Desc=测试日期 ControlType=DATETIME>

</Item>

<Item Name=smtpListTest Value= Desc=测试列表 ControlType=DROPLIST Dict=|值|值|值>

</Item>

</EmailConfig>

上一篇:WCF中通过Dispose有效实现重用

下一篇:实现DataList和Repeater控件的分页显示