Dev.Hong
将欲取之 必先予之……
随笔- 53  文章- 0  评论- 220 
博客园  首页  新随笔  联系  管理  订阅 订阅
DotNet下的自定义配置方案

在App.Config或Web.Config都可以进行自定义配置,但使用起来比较麻烦,尤其是在Web.Config中如果改动了自定义的配置会导致整个Web Application重启,所以自已写了一个配置方案,使用起来还是挺方便的

首先我们定义一个IConfiguration接口,

    /// <summary>
    
/// 定义配置管理接口
    
/// </summary>
    public interface IConfiguration
    {
        
/// <summary>
        
/// 当前的配置类型
        
/// </summary>
        System.Type CurrentType { get; }
        
/// <summary>
        
/// 保存配置文件
        
/// </summary>
        
/// <param name="setting"></param>
        void SaveSetting( ISetting setting );
        
/// <summary>
        
/// 加载配置
        
/// </summary>
        
/// <returns></returns>
        ISetting LoadSetting();
        
/// <summary>
        
/// 加载默认的配置项
        
/// </summary>
        
/// <returns></returns>
        ISetting LoadDefaultSetting();
    }


再定义一个ISetting接口

    /// <summary>
    
/// 具体配置项接口
    
/// </summary>
    public interface ISetting
    {
        
/// <summary>
        
/// 返回默认的配置项
        
/// </summary>
        
/// <returns></returns>
        ISetting LoadDefaultSetting();
    }

接着实现IConfiguration接口,用作配置管理基类
    /// <summary>
    
/// Xml配置管理基类
    
/// </summary>
    public abstract class XmlConfigBase : IConfiguration
    {
        
#region Constructors
        
/// <summary>
        
/// 初始化类新实例
        
/// </summary>
        protected XmlConfigBase() {}
        
#endregion

        
#region MustOverride Methods
        
/// <summary>
        
/// 配置路径
        
/// </summary>
        public abstract string ConfigFilePath { get; set; }
        
#endregion

        
#region IConfiguration 成员
        
/// <summary>
        
/// 返回当前配置类型
        
/// </summary>
        public abstract Type CurrentType { get; }
        
/// <summary>
        
/// 保存配置
        
/// </summary>
        
/// <param name="setting"></param>
        public void SaveSetting( ISetting setting )
        {
            
if ( System.IO.File.Exists( this.ConfigFilePath ) )
                System.IO.File.Delete( 
this.ConfigFilePath );

            
this.SaveSetting( setting, this.ConfigFilePath );
        }
        
/// <summary>
        
/// 保存配置
        
/// </summary>
        
/// <param name="setting"></param>
        
/// <param name="filepath"></param>
        public void SaveSetting( ISetting setting, string filepath )
        {
            
//Services.XmlUtils.Serialize为一自定义静态方法,作用是将一个可序列化的对象序列化

到指定的路径中
            Services.XmlUtils.Serialize( setting, filepath );
        }
        
/// <summary>
        
/// 加载配置
        
/// </summary>
        
/// <returns></returns>
        public ISetting LoadSetting()
        {
            ISetting objData 
= null;
            
//首先从缓存中进行加载
            
//Services.DataCache.GetCache是对System.Web.HttpRuntime.Cache的一个简单封装
            objData =( ISetting )Services.DataCache.GetCache( this.CurrentType.ToString() + 

this.ConfigFilePath );
            
if ( objData == null )
            {
                System.IO.FileInfo objFile 
= new System.IO.FileInfo( this.ConfigFilePath 

);
                
//判断配置文件是否存在,如果存在,则序列化,反之则加载其默认的配置内容
                if ( objFile.Exists )
                {
                    System.IO.FileStream fs 
= null;
                    
try
                    {
                        fs 
= objFile.Open( System.IO.FileMode.Open 

,System.IO.FileAccess.Read ,System.IO.FileShare.Read );
                        objData 
= ( ISetting )Services.XmlUtils.Deserialize( 

this.CurrentType, fs );
                    }
                    
catch ( System.Exception ex )
                    {
                        
//当反序列化出错时,则加载默认的配置,并保存配置
                        log4net.LogManager.GetLogger( this.GetType() ).Debug( 

ex.ToString() );
                        objData 
= this.LoadDefaultSetting();
                        
this.SaveSetting( objData );
                    }
                    
finally
                    {
                        
if ( fs != null )
                            fs.Close();
                    }
                }
                
else
                {
                    objData 
= this.LoadDefaultSetting();
                    
this.SaveSetting( objData );
                }
                Services.DataCache.SetCache( 
this.CurrentType.ToString() + 

this.ConfigFilePath, objData, new System.Web.Caching.CacheDependency( this.ConfigFilePath ) );
            }
            
return objData;
        }
        
/// <summary>
        
/// 加载默认的配置项
        
/// </summary>
        
/// <returns></returns>
        public abstract ISetting LoadDefaultSetting();
        
#endregion
    }


以上就是实现自定义配置管理的基础部分,下面看看具体应用

下面的代码实现的功能为建立一个站点配置,具体的配置项有SqlConnectionString和SiteName

/// <summary>
    
/// 站点配置管理类
    
/// </summary>
    public class AppConfig : XmlConfigBase
    {
        
#region Private Fields
        
private System.String m_path = null;
        
static private AppConfig m_config = null;
        
#endregion

        
#region Constructors
        
/// <summary>
        
/// new
        
/// </summary>
        private AppConfig()
        {
            
this.m_path = System.IO.Path.GetFullPath( System.IO.Path.Combine( 

System.Threading.Thread.GetDomain().BaseDirectory, 
"Site.Config" ) );
        }
        
#endregion

        
#region Override Methods
        
/// <summary>
        
/// 配置文件名称
        
/// </summary>
        public override string ConfigFilePath
        {
            
get { return this.m_path; }
            
set { this.m_path = value; }
        }
        
/// <summary>
        
/// 加载默认的配置 
        
/// </summary>
        
/// <returns></returns>
        public override BlogMap.Configuration.ISetting LoadDefaultSetting()
        {
            
return new AppSetting().LoadDefaultSetting();
        }
        
/// <summary>
        
/// 配置类型
        
/// </summary>
        public override Type CurrentType
        {
            
get { return typeof( AppSetting ); }
        }
        
#endregion

        
#region Methods
        
/// <summary>
        
/// 返回当前对象的单件实例
        
/// </summary>
        
/// <returns></returns>
        static public AppConfig Current()
        {
            
if ( m_config == null )
                m_config 
= new AppConfig();

            
return m_config;
        }
        
#endregion
    }


    /// <summary>
    
/// 站点具体配置项类
    
/// </summary>
    public class AppSetting : ISetting
    {
        
#region Private Fields
        
private string m_sqlConnectionString = null;
        
#endregion

        
#region Constructors
        
/// <summary>
        
/// new
        
/// </summary>
        public AppSetting(){}
        
#endregion

        
#region Properties        
        
/// <summary>
        
/// 数据库连接字符串
        
/// </summary>
        public string SqlConnectionString
        {
            
get { return this.m_sqlConnectionString; }
            
set { this.m_sqlConnectionString = value; }
        }
        
#endregion

        
#region ISetting 成员
        
/// <summary>
        
/// 加载默认的配置
        
/// </summary>
        
/// <returns></returns>
        public ISetting LoadDefaultSetting()
        {
            
this.m_sqlConnectionString = ".";
            
return this;
        }
        
#endregion
    }


AppConfig和AppSetting都已经实现了,获取SqlConnectionString属性只要
( AppConfig.Current().LoadSetting() As AppSetting ).SqlConnectionString 便可


使用此自定义配置当AppConfig.Current().LoadSetting()时,实际过程是将 Site.Config 反序列化成一个对象,因此可

以很轻松的应用 WinForm 的 PropertyGrid 控件写一个可视化的配置编辑器.

posted on 2007-04-14 13:52 Dev.Hong 阅读(383) 评论(0) 编辑 收藏
刷新评论刷新页面返回顶部
程序员问答社区,解决您的IT难题
博客园首页博问新闻闪存程序员招聘知识库
Copyright ©2012 Dev.Hong