利用泛型进行网站序列化配置

本文源码:/Files/genson/Site_Config_demo.rar
发布日期:2008-1-29
适用于vs2005,asp.net2.0或以上版本  


前言

在开发网站的时候,我们通常都需要做一些配置,把配置保存在数据库或者文本中,比如开发一个论坛程序,我们有邮箱配置,缓存配置,相册配置,回复帖子配置,图片水印配置,页面关键字配置等等,这么多配置。 我们可以用数据库把所有配置都保存到一个表中,但现在我介绍的是用文本配置,序列化保存配置好数据。

文本配置的好处

为什么要用文本进行网站的配置呢,有几个好处:
1. 修改方便,包括需求的变更,配置参数的设置。只需要修改配置类,重新配置就可以了。
2. 与数据库脱离,方便移植。
3. 应用性广,有些项目不一定用到数据库,这就体现了文本配置的好处。

实现思路


1. 先定义好IConfig<T>和IConfigManager<T>的接口。其中,IConfig<T>是配置文件类的基类,IConfigManager<T>是实现配置文件配置的基类,2个接口里面都定义好了 bool SaveConfig(T t);  T  LoadConfig();这2个方法。他们之间的关系如下图:

2. 利用where关键字对泛型进行约束。
SDK是这样描述的:

where 子句用于指定类型约束,这些约束可以作为泛型声明中定义的类型参数的变量。例如,可以声明一个泛型类 MyGenericClass,这样,类型参数 T 就可以实现 IComparable<T> 接口:

public class MyGenericClass<T> where T:IComparable { }
而我们定义的IConfig如下
 /// <summary>
    
///  配置信息类接口
    
/// </summary>

    public interface IConfig<T> where T:IConfig<T>,new()
    
{
        
/// <summary>
        
/// 配置保存的文件名称
        
/// </summary>

        string FileName get;  }

        
bool SaveConfig(T t);

        

        T LoadConfig();
        
    }

这就保证了T一定是是实现IConfig接口的。同理。 ConfigManager<T>也定义如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using Madou.Core;
namespace Madou.Config
{
    [Serializable]
    
internal  class ConfigManager<T>:IConfigManager<T> where T:IConfig<T>new()
    
{
       

        
IConfigFileManager Members


    }

}


 ConfigBase<T>是实现IConfig<T>的抽象类,我们实现如下。
 [Serializable]
    
public abstract class ConfigBase<T> : IConfig<T> where T : IConfig<T>new()
    
{

      

        
IConfig Members

        
public static T Current
        
{
            
get
            
{
                T t
= new T();
                
return t.LoadConfig();
            }

        }

    }
基础的类框架已经做好,下面我们分别定义不同的配置了。如果我们定义一个邮件配置,可以这样实现。
Code

其他配置请参考邮件配置的写法,只要继承ConfigBase<T>就可以了。
posted @ 2008-01-29 14:06  永不言败  阅读(2419)  评论(9编辑  收藏  举报