浅谈.Net版(C#)的CMP模式 - 一个上线商城的系统架构2011-12-13 博客园 billrobin商城上线快2、3个月了,一直都懒得写点东西,在加上杂七杂八的事情也比较忙,所以都没有把这个系统当时做的整个架构思绪整理清,昨天才从深圳完了两天回来,怎感觉是要做的事来着.刚开始接触CMP模式的时候也是看了它几天,到谷歌百度里面一搜,我们博客园里面就有蛙蛙池塘的提高软件开发效率三板斧之二利用CMP模式一文里有它的详细介绍,在这里我自己也对这个用CMP模式拿来真正上项目时候的问题来做个总结.项目名称:惠海IT商城网址:http://http://www.huihaimall.com/开发环境:WinXP SP3、IIS5.0、Dreamweaver、VS 2005、SQL-Server 2000项目描述:项目实现了商品的浏览筛选(主要是公司做的IT产品)、会员商品收藏、订购(订单)、发邮件推荐给朋友、会员积分、收货地址薄、DIY自主装机等,业务逻辑全部在本项目中用.NET(CMP)实现,而展示就不一定都是用.net的aspx页面来做,如DIY装机就是用Flex生成flash来实现的,但是它们都是同步的(同登陆同注销,包括会员产品收藏等).还有一个最重要的就是后台管理也是用Flex调用.net来实现的,由于要提供Flex调用的接口,所有还提供了几个WebService的页面(关与身份验证请见:在WebService中使用Session或Cookie---实现WebService身份验证(客户端是Flex) ),另外在用JQuery发送Ajax请求的时候页面传输数据时候还有用到Json数据(Flex好象有几个地方也用到了).项目解决方案截图如下:

下面,我对上图所示以我的了解进行简要的介绍:CMPServices 它里面主要是一些CMP配置和服务的基类,他们对应的名称和功能内如下所:
| 名称 | 功能描述 |  | 
| CMPConfigurationHandler | 继承自IConfigurationSectionHandler,用来读取在Web.Config文件内的自定义CMP配置. | 
| CommandMapping | 命令映射类,用于某一个业务的容器,一般为对应Insert、Delete、Update、Select里某一个存储过程名为CommandName,里面可能包含多个CommandParameter. |  | 
| CommandParameter | 存储过程参数类,里面有ParameterName、Size、DbTypeHint等属性,还有一个ClassMember的属性,表示对应实体模型的属性,一般ParameterName为@Name而ClassMember值就为Name(预先配置好的),因为一般存储过程的参数名就对应数据库实体模型的列字段. |  | 
| ContainerMapping | 容器映射类,一般为一个业务实体,比如用户,它里面就有Insert、Delete、Update、Select这4个CommandMapping,而且它有个key在CMP里面的映射ID叫ContainerMappingId和ContainedClass对应为实体对象模型名. |  | 
| ContainerMappingSet | 多个ContainerMapping容器映射集合类,里面的Hashtable可根据ContainerMappingId映射ID的key来匹配ContainerMapping. |  | 
| PersistableObject | 持久对象基类,实体类继承它能实现对数据的保存(一般为Insert、Delete、Update命令操作). |  | 
| PersistableObjectSet | 继承自PersistableObject,实现数据持久化保存结果(一般为Select命令操作). |  | 
| SqlPersistenceContainer | 业务的容器基类,构造函数需ContainerMapping,包含Insert、Delete、Update、Select四个虚方法. |  | 
| StdPersistenceContainer | 业务的容器,构造函数ContainerMapping调用父类构造函数,根据ContainerMapping对Insert、Delete、Update、Select四个方法进行具体的实现. |  |