关于通用配置管理模块的思考
近来打算写一些通用的模块,目的就是以后在开发中可以拿来就用以节省开发时间。 写配置管理模块的时候遇到了一些麻烦!
所谓通用当然要在一定程度上有一定自适应的能力,至少通用模块对于开发不管web程序还是应用程序
都无需在任何代码的修改。
配置管理类顾名思义就是用来管理配置的,其中的配置包括数据库的类型,提示信息(程序错误时的信息,对用户 的动态提醒,系统日志信息等),log路径以及任何可以以用户的意愿随时修改的东西。 在设计的时候我打算把配置文件和配置管理类文件放到一级目录里(后来才发现自己的设计多么幼稚,汗!)
先说说我遇到的问题吧!
首先访问这个配置文件就是一个很大的问题,绝对路径肯定不能用,相对路径,但是怎么用?
我请教了一些朋友,他们提供的答案无非就是用Application.StartUpPath,Server.MapPath但是大家想想这样肯定不能实现的。 我尝试着用反射实现,但是还是只能得到可执行程序集的路径。 后来想想一个配置是针对一个应用的,怎么说也不应该和通用类关联起来,也就是说配置文件应该放到具体应用的一个特定目录里,而不该独立于应用存在。 再者一个成熟的通用来是应该以程序集的方式被引用的,有网友建议我把这个配置文件整个编译到程序集中,且不说 是否可以访问,至少不能动态修改配置信息了,所以将配置文件做为具体应用的一部分是合理的。 后来想起来真庆幸问网友这个问题的时候人家没有当面指出来,不然...嘿嘿,太尴尬了,居然搞出这样的设计!!! 但是不管怎么样,我还是想知道如何得到一个类文件的所在的目录,如果哪位朋友知道恳请告之- email:zzq9624#163.com
目前的实现思路大致是放到xml文件中,然后用的是最简单的方法访问,就是用DataSet.Read,然后读出的数据放到一个Hashtable中 只是为了很方便的索引。 为了安全可以把文件的后缀改成config(在浏览器中可以查看xml文件的)
简单的代码实现如下:
/*****************************************************************
* Modulename: SettingManager
* Author : zhaozhanqiang
* CreateTime; 2005-6
* Descrption: Read settings of current application
* CopyRight : All rights reserved
* Modify Time:
* Vertion: 1.0
* ***************************************************************/
using System;
using System.Collections;
using System.Data;
using System.Diagnostics;
using System.IO;
using System.Web;
using System.Web.UI;
namespace zzq.DotNet.SettingsManager
{
/// <summary>
/// Read settings of current application
/// </summary>
public sealed class SettingManager
{
private static DataSet ds=null;
public SettingManager()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
/// <summary>
/// When set isReadSetting true,you will read application settings,or else you will read messages about log or warning .
/// </summary>
/// <param name="key"></param>
/// <param name="isReadSetting"></param>
/// <returns></returns>
public static string GetSetting(string key,bool isReadSetting)
{
// System.Web.HttpServerUtility htt=new HttpServerUtility();
// string k=htt.MapPath("Settings.xml");
ds=new DataSet();
Hashtable tmpHash=new Hashtable();
string strPath=Directory.GetCurrentDirectory();
if(isReadSetting)
{
strPath=strPath.Substring(0,strPath.IndexOf("bin")-1)+"\\Setting\\Settings.config";
}
else
{
strPath=strPath.Substring(0,strPath.IndexOf("bin")-1)+"\\Message\\Messages.config";
}
ds.ReadXml(strPath);
for (int i=0;i<ds.Tables[0].Rows.Count-1;i++)
{
if(Convert.ToString(ds.Tables[0].Rows[i].ItemArray[0])!=string.Empty)
{
tmpHash.Add(ds.Tables[0].Rows[i].ItemArray[0].ToString(),ds.Tables[0].Rows[i].ItemArray[1].ToString());
}
}
return tmpHash[key].ToString();
}
}
}
如果您有什么好的意见或者建议请联系我:zzq9624#163.com