探索中国CIO人才现状 | 第四季调研报告
基于CMP的CRM系统设计
2014-03-11  作者:万方数据 

  1引言


  CRM即客户关系管理,CRM系统借助于Web技术,以电子化方式完成从市场、销售到服务的全部商务过程,以实现全动态交互式的客户关系管理。在设计CRM系统过程中,传统基于组件的设计模式(Component-ManagedPersistence,托管组件式持久性)在设计的时候显得有点笨拙,每一数据库数据结构的修改都要导致从新编译底层组件;而托管容器式持久性(Container-ManagedPersistence,CMP)这种没汁模式比较灵活,系统中所有数据对象都不考虑自身的数据访问方法,所有的业务对象是纯粹的业务对象。他们维护业务数据并根据业务规则判断这些数据是否正确,业务对象和数据访问层没有丝毫关系。因此本系统体系机构的数据访问部分采用托管容器式持久性方式。


  2CMP模式


  托管容器式持久性是一种设计模式,在这种模式下业务对象不考虑数据从何处来,以及如何存放。这种模式下容器是一个类,它的任务是得到一个未知数据源的业务对象实例,并且进行数据操作。这里的操作指CRUD(Create、Retrieve、Update、Delete,即创建、检索、更新、删除)4种数据操作中的任何一种。基本流程如下:


  1)业务对象被其它某些控件调用.例如被Web页面的后台编码调用。


  2)业务对象创建一个容器和一个持久对象,也就是一个以托管容器式持久性方式运行的对象。


  3)然后业务对象调用容器上相关的SELECT、INSERT、UPDATE和DELECT(CRUD)操作方法来执行实际的数据访问。


  3创建CMPServer项目


  首先需要建一个CMPServer项目,CMPServer项目是托管容器式持久性系统的核心,整个数据层都放在同一个程序集里面。CMPSever项目主要包括下面几个类:CMPConfigurationHandler、CommandMapping、ContainerMapping、PersistableObjectSet、StdPersisteneeContainer、sqIPersistenceConlainer。这些类可以参考《ASP.NET电子商务高级编程》。


  4子模块实现


  每个模块都要包含自己的数据库,存储过程,元数据,BLL程序集,服务器控件,表示层等。每个模块的创建流程为:创建数据库、创建存储过程、创建所需要元数据、创建业务逻辑项目、创建界面所需要的服务器控件。下面以客户管理模块为例介绍其具体实现过程。


  4.1创建数据库


  客户信息字段命名如下:CustomerIDint(4)客户编号、CustomerNamenvarchar(100)客户名称、Emailvarehar(30)电子邮件、Addressnvarchar(50)地址、Telvawhar(20)电话、CustomerSoureenvarchar(20)客户来源、CustomerTypenvarchar(10)客户类型、CustomerStatenvalchar(10)客户状态、CreateNamenvarchar(10)创建人。


  4.2创建存储过程


  所有的数据操作全用存储过程来写,方便对数据流的集中管理。选择实体详细信息的存储过程,不用返回记录集,因为只返回一条数据,所以把每个字段都用output参数返回,就是以标识的方式返回。该模块的存储过程如表1所示。


  表1客户管理模块中的存储过程


  4.3配置元数据


  元数据是让CMP进行数据库持久操作的通道,CMP是通过元数据映射来获取存储过程的信息,最终执行存储过程的。元数据放在web.config里,所以存储过程有一些变动的话,改一下元数据就行了,BLL层和DAL层的数据都不用动,而改动了web.config里的文件,应用程序会自动重新加载这些元数据而更新相应的业务逻辑。下面给出客户信息的元数据片断。


  <GWConng>


  <ContainerMappingSet>


  <ContainerMapping>


  <ContainerMappingId>CustomerDetail</ContainerMappingld>


  <ContainedClass>CustomerEntiy</ContainedClass>


  <Select>


  <CommandName>DCN_Customerselect</CommandName>


  <Parameter>


  <CtassMember>CustomerID</ClassMember>


  <ParameterName>@CustomerID</ParameterName>


  <DbTypeHint>Int</DbTypeHint>


  <ParamDirection>Input</ParamDirection>


  <Size>4</Size>


  </Parameter>


  <Parameter>


  <ClassMember>CustomerName</ClassMember>


  <ParameterName>@CustomerName</ParameterName>


  <Did、ypeHint>Nvarchar</DlffypeHint>


  <ParamDirection>Output</ParamDirection>


  <Size>200</Size>


  </Parameter>


  </Select>


  </ContainerMaloping>


  </ContainerMappingSet>


  </GWConfig>


  4.4.1业务实体类说明


  本系统业务实体类全部继承自GW.CMPServices.PersistableObjectSet类,具体实现不做叙述。


  4.4.2BLL类库开发


  因为有CMP架构的帮助.BLI。层开发非常容易了。具体步骤如下:


  1)从CMPConfigurationHandler.ContainerMaps缓存里实例一个容器。


  2)创建一个业务实体类的实例。


  3)把业务实体的实例传人容器的CRUD方法里进行持久化操作。


  publicclassCustomerManager


  {


  //添加客户


  publicstaticvoidAddCustomer(StringCustomerName,


  //获取所有客户


  publicstaticDataTableGetAllCustomers0


  //获取客户详细信息


  publicstaticData.CustomerEntityGetCustomerDetail(IongcustomerID)


  //删除一个客户


  publicstaticvoidDeleteCustomer(10ngcustomerlD)


  //更新一个客户信息


  publicstaticvoidUpdateCustomer(StringCustomerName,……longCustomerID)


  }


  4.5表示层的实现


  下面给出CustomerList.Aspx页面的主要代码。


  privatevoidPage_Load(objectsender,System.EventArgse)


  {


  this.BindCustomerList();


  overrideproteetedvoidOnlnit(EventArgse)


  privatevoiddgrdCustomerList_SelectedlndexChanged(objeetsender,System.EventArgse)


  privatevoiddgrdCustomerList_DeleteCommand


  (objectsonrce,System.Web.UI.WebControls.DataGridCommandEventArgse)


  }


  通过实践对比总结出.使用CMP的好处:首先,数据库变化不需要重新编译数据操作层,因为所以的数据定义都在Web.config做了定义,只要按照相应格式更改就可以直接使用。其次,由于数据操作被封装再CMP中,业务对象数据访问没有如何联系,这样就可以很方便的使用多种数据来源,比如XML,Access,SQLServer,WebServices。缺点:开发过程相对托管组件式持久性复杂,在WebApplication中才被应用,Windows程序应用少。