技术开发 频道

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

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

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

  设计目标:

  1、 高速读取配置信息

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

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

   大致设计思路

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

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

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

   代码参考:

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

using System;
using System.Collections;
using System.Web;
using System.Web.Caching;
using System.Xml;

namespace Epower.DevBase.BaseTools
{
    
/// <summary>
    
/// ConfigHelper 的摘要说明。
    
/// 自定义的系统参数配置文件的读取工具类
    
/// </summary>
    public class ConfigHelper
    {
        
/// <summary>
        
/// 取~/Config/CommonConfig.xml中某个参数名对应的参数值
        
/// </summary>
        
/// <param name="ParameterName">参数名</param>
        
/// <returns>参数值</returns>
        public static string GetParameterValue(string ParameterName)
        {
            
return GetParameterValue("EpowerConfig", ParameterName);
        }

        
/// <summary>
        
/// 取某个参数配置文件中某个参数名对应的参数值
        
/// 参数配置文件
        
///        1、必须存放于"~/Config/"目录下面,以.xml为后缀
        
///        2、配置格式参见~/Config/CommonConfig.xml
        
/// </summary>
        
/// <param name="ConfigName">配置文件的文件名,不要后缀</param>
        
/// <param name="ParameterName">参数名</param>
        
/// <returns>参数值</returns>
        public static string GetParameterValue(string ConfigName, string ParameterName)
        {
            Hashtable CommonConfig
= GetConfigCache(ConfigName);

            
if (CommonConfig.ContainsKey(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
= HttpRuntime.Cache;

            
if (cache[CacheName] == null)
            {
                
string ConfigPath = null;

                
#region 取应用程序根物理路径
                
try
                {
                    ConfigPath
= HttpRuntime.AppDomainAppPath;
                }
                
catch (System.ArgumentException ex)
                {
                }

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

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

                XmlDocument xmlDoc
= new XmlDocument();
                xmlDoc.Load(ConfigFile);

                XmlNode oNode
= xmlDoc.DocumentElement;

                
if (oNode.HasChildNodes)
                {
                    XmlNodeList oList
= oNode.ChildNodes;

                    
for (int i = 0; i < oList.Count; i++)
                    {
                        CommonConfig.Add(oList[i].Attributes[
"Name"].Value, oList[i].Attributes["Value"].Value);
                    }
                }

                cache.Insert(CacheName, CommonConfig,
new CacheDependency(ConfigFile));
            }
            
else
                CommonConfig
= (Hashtable) cache[CacheName];

            
return CommonConfig;
        }
    }
}
0
相关文章