关于通用配置管理模块的思考


         近来打算写一些通用的模块,目的就是以后在开发中可以拿来就用以节省开发时间。 写配置管理模块的时候遇到了一些麻烦!
       所谓通用当然要在一定程度上有一定自适应的能力,至少通用模块对于开发不管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
  

posted @ 2005-06-29 21:34  zhanqiangz(闲云野鹤)  阅读(751)  评论(0编辑  收藏  举报