在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();
}
/// 定义配置管理接口
/// </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();
}
/// 具体配置项接口
/// </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
}
/// 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>
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
}
/// 站点具体配置项类
/// </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 控件写一个可视化的配置编辑器.
