利用泛型进行网站序列化配置
本文源码:/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如下
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
这就保证了T一定是是实现IConfig接口的。同理。 ConfigManager<T>也定义如下:
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](/Images/OutliningIndicators/None.gif)
而 ConfigBase<T>是实现IConfig<T>的抽象类,我们实现如下。
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
其他配置请参考邮件配置的写法,只要继承ConfigBase<T>就可以了。