星辰.Net技术社区论坛

首页 » .NET » 设计模式GOF » 提高软件开发效率----利用CMP模式
neptune - 2008-6-22 14:11:00
“我们通常将体系结构看作一系列服务的集合,用来执行其他代码,这些服务应当提供有效的功能和特性来完成一些特定目标。”建立体系结构时必须牢记几个目标íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
1.íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
尽量创建可重用的代码íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
2.íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
加强设计模式和最佳实践íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
3.íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
提供通用功能íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
4.íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
提供开发基础íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
了解了设计体系结构的目标后,还应该明确体系结构应该提供的服务,在深入讨论之前建议大家先研究一下IbuySpy,Nile,Pet Shop等站点的体系结构,这些站点都非常好,也很正确。但这个架构要构建一个易于维护,升级,增强功能的架构。先列举一下需要架构提供的服务列表。íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
1.íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
数据服务íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
这里用到的时托管容器式持久性模型(CMP),它是一种设计模式,这种模式下业务对象不考虑数据从何处来,以及如何存放。业务对象可以是纯粹的业务对象,它们维护业务数据并根据业务规则判断这些数据是否正确,并且和数据库访问层没有丝毫关系。关于CMP的更多详细的信息,可以去买一本清华出版的《asp.net电子商务高级编程》以及相关网站资料,这里给出两个相关链接。íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
2.íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
监测服务íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
这里提供一套标准的服务来完成软件的监测任务。这里的监测是指记录,跟踪,错误处理,还有其它与跟踪系统正在做什么以及谁正在使用系统等相关的任务。这些服务包括跟踪变量,记录不同来源的错误和其它信息,以及使用自定义异常等íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
3.íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
安全服务íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
设计安全服务是为了提供足够的安全,不过这里用到的安全服务非常简单,仅仅实现了身份验证的功能,其实安全在开发过程中是一项不容忽视且相当艰巨的任务,包括防止脚本注入,数据库注入,实现数字签名,混淆代码以防止代码斜路以及web服务中的一些安全实现等。最近我买了一本《ASP.NET安全性高级编程》,那本书对在asp.net开发过程中如何实现安全性这个问题有很完整的阐述,建议大家可以买一本看看。íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
4.íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
配置服务íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
配置服务是用来控制应用程序所需要的配置选项的。这里的配置服务也是比较简单的,不过可以以后根据需求改进设计并加强体系结构中的这个部分。íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
因为篇幅有限,不可能对架构中的每个项目的每个类都逐一分析讨论,这里给出一个简单的类的功能列表,以方便你理解和使用这个架构,当然还有好多更吸引人和有用的技巧在里面,建议你下载源代码后慢慢研究一下,就这个架构我零零碎碎的看了3个多月才开始真正的使用它并把它用到实际开发中去,源代码可以去wrox的网站去下载,也可以在本篇文章提供的地址去下载,前面说了,这个架构有足够的扩展性,你完全可以根据你的需要来写一个针对access和oracle的SqlPersistenceContainer类,或者在实现安全服务的íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
1.íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
CMPServices项目íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
CMPServices项目íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
功能íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
CMPConfigurationHandler.csíS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
它负责从web.config文件的自定义配置部分加载元数据配置信息íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
ContainerMappingSet.csíS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
元数据配置的顶层是XML根结点,包含一个容器映射的列表,这个容器映射的集合保存在ContainerMappingSet类的一个实例中。它具有基于XML结点进行自身初始化的功能,以及用于调试的手动装载功能íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
ContainerMapping.csíS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
实现容器映射,对单个对象关系映射的抽象。它允许一个容器(如SQL持久性容器或XML容器等)获得对象实例的足够信息,该对象实例可用于执行对象关系映射,它可以让对象实例保持对底层数据源的持久性。一个容器映射最多包含4个命令映射(限于CRUD标准的4个命令)。íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
CommandMapping.csíS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
命令映射是CRUD动作的表现,可以被底层数据源执行,对于SQL容器,定义了4个CommandMapping,分别实现INSERT,UPDATE,SELECT,DELETE方法的支持.它还包含一个参数列表,并使属性总是显示命令的名称(可以映射到某个存储过程)和提供者提示,并允许在同一个容器和数据源中从不同的数据库得到不同的命令。íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
CommandParameter.csíS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
它包含的信息可以将类示例的公共属性和字段映射到数据源上使用的特定命令参数,它包括下列属性:类属性,参数名称,数据类型,大小,参数方向。íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
PersistableObject.csíS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
这是一个基类,它提供一系列让对象参与托管容器式持久性的基本功能,任何希望它的实例参与托管容器式持久性的类都必须继承这个类,它提供单条需要保持的数据。如果需要从数据库或者其它数据源获得多条数据查询结果,可以利用这个类。íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
PersistableObjectSet.csíS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
这个类继承自PersistableObject类如果不能提前返回数据集的大小,就需要用这个类来维护一个内部数据集,这个内部数据集相当于容器执行命令后的返回数据的存储处。容器可以事先知道它处理的是PersistableObject类还是PersistableObjectSet类可以动态决定命令执行后将返回的数据结果保存在哪里。íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
StdPersistenceContainer.csíS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
StdPersistenceContainer类是一个基类,它定义了所有容器必须提供的核心功能。这里采用类而不是接口,所以可以实现一些默认的功能,并且可以在整个架构中利用它的多态性使问题简化。íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
SqlPersistenceContainer.csíS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
SqlPersistenceContainer是持久性容器的一个实现,是专门为SQLserver设计的,可以针对sqlserver数据库的select,insert,update,delete操作方法。该类的其它内部容器映射来分析对象的关系映射,在对象实例和数据源之间交换数据。íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
2.íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
ConfigurationServices项目íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
ConfigurationServices项目íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
功能íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
SiteProfile.csíS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
在这里主要提供了一些程序运行的所有对象可以用到的静态属性,比如加载元数据,CMP数据引擎的数据库类型集合,指明默认数据源的连接字符串等。这些静态成员在应用程序启动时被加载起来,也就是在Global.asax文件里实现的,下面我会讲的。íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
3.íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
MonitorServices项目íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
MonitorServices项目íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
功能íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
GWTrace.csíS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
GWTrace.类负责提供标准的跟踪功能。该类统一了跟踪信息的存放位置。它知道web.config文件里的一个跟踪级别开关,但跟踪不同等级详细信息时会进行识别。合理应用该类的方法可以大大方便你在开发中对代码运行的跟踪。íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
MonitorUtilities.csíS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
该类提供了一些工具类方法,在监测系统中对其它方法非常有用,例如包含了返回机器名,应用程序名称,进程信息的方法它还提供了一个SafeFormat方法,它提供了一个安全,不引起错误的办法把对象参数转换成标准格式的字符串。íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
4.íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
MonitorServicesLogging项目íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
MonitorServicesLogging项目íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
功能íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
DbErrorEntry.csíS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
该类是一个PersistableObject类,在存储一条错误信息记录到数据库时,它用作与数据库的接口。它只是写入数据库或者读出的错误记录信息的一个简单的占位符号。íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
DbErrorEntrySet.csíS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
该类时一个PersistableObjectSet类,包含了在一定数据范围内返回一列错误所需的参数信息。为了管理而检查一个特定时间段的错误记录的时候,该类非常有用íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
DbErrorLog.csíS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
该类负责在数据库中维护错误记录信息,这些错误记录包含错误来源,运行时返回的进程等详细信息,以及实际的异常内容íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
FileErrorLog.csíS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
该类只是简单的把错误信息记录到一个文件,虽然该类可以单独使用,但开发者不应该单独调用它,而应该调用ErrorLog类。ErrorLog类会把错误先记录到数据库,只把文本文件作为一种数据库出问题时的备份íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
ErrorLog.csíS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
该类用于筛选错误记录,它首先尝试把错误记录送到数据库中。如果失败,他会把错误信息写入文件;如果成功,他会在文件中留下信息指出错误记录已经成功保存在数据库,并附带一个合适的错误ID。íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
GWException.csíS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
这是一个自定义异常类,当实例化改类时,类实例可获得的错误信息就会发送给ErrorLog类,以将其持久保存到数据库或相应的文本文件中,这样就保证了开发者在任何时候实例化改类或其子类对应的异常时,错误信息都能够以可靠的形式保存下来。它还有个方法将基于一个数字键在内部资源文件ErrorMessages.resx中检索异常信息。这个数字键由GWExceptionMessages的枚举项提供íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
GWExceptionMessages.csíS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
改类时包含了证书值的枚举项,在加载错误信息字符串时,这些证书值在资源文件内被用做键。íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
架构已经有了,现在想办法把这个架构利用到实际的开发中,这里演示一个简单的留言板程序,其中也实现了对数据库的添加,删除,修改,选择等基本功能。其实一个大的项目也无非是由这样小的独立的功能模块构建起来的,这里只是抛砖引玉。闲话不说,我们来一步一步进行。 íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
1.íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
构建项目íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
新建立一个web项目,这里是wawabook.然后把CMPServices,ConfigurationServices,MonitorServices,MonitorServicesLogging这4个文件夹拷贝到项目根目录下,并在解决方案里添加已有项目,把那这个项目添加进去。另外还有SharedAssemblyInfo.cs,GadgetsWarehouse.snk也拷贝到根目录下,一个是版权信息,一个是程序集的强名键。不用改动直接复制过来就可以。完成后解决方案管理器大致如下图。注意一下各个项目之间的依赖性,因为各个项目之间有交叉引用,关于各个项目之间的关系可以在源代码中看出来。íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
2.íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
建立数据库和相关表,存储过程íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
按实际的需求在sqlserver里建立数据库,表以及相应的存储过程。这里的数据库名叫wawabook,表名叫GuestBook,在创建表时最好把字段的描述信息写上,这时很有用的,方便以后查看和理解,完成后如下图。íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
分别建立对GuestBook表的INSERT,SELECT,UPDATE,DELETE的存储过程如图íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
这里只给出insert_GuestBook的存储过程源码供参考,其它存储过程可以在本文附带的数据库源码中查看íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
CREATEíS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
PROCEDUREíS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
[insert_GuestBook]íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
(
@UserNameíS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
[nvarchar](10),íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
@MailíS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
[varchar](50),íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
@TitleíS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
[nvarchar](50),íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
@ContentíS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
[ntext],íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
@AddDateíS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
[datetime],íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
@IPAddressíS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
[varchar](50))íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
ASíS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
INSERTíS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
INTOíS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
[wawabook].[dbo].[GuestBook] íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
(
[UserName],íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
[Mail],íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
[Title],íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
[Content],íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
[AddDate],íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
[IPAddress]) íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
VALUES íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
(
@UserName,íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
@Mail,íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
@Title,íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
@Content,íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
@AddDate,íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
@IPAddress)íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
GOíS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
另外把SystemErrors表,GW_INSERT_ERRORLOG_SP存储过程复制到你新建的数据库里,因为程序出错的时候会用到这个表和存储过程来记录错误日志。 你可以自己写一个GW_GET_ERRORLOG_SP存储过程来在出错误的时候查看错误日志以分析错误的原因所在。íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
3.íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
配置web.configíS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
这里要配置几个地方,数据库连接字符串,跟踪级别开关,元数据等,这里只说一下额外需要特殊配置的地方,具体的web.config配置根据你的程序需要而定,比如说安全小节,身份验证小节,http小节等。íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
1)因为元数据在web.config文件保存,而web.config是个固定格式的文件,这就要指定这个自定义节点。íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
<configSections>íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
       
<section name="GWConfig" type="GW.CMPServices.CMPConfigurationHandler, GW.CMPServices"íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
/>íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
</configSections>íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
2)为了让跟踪项目能够合理的工作,需要定义项目跟踪级别,下面的小节定义了项目的跟踪级别,具体可以根据你项目实际需求来设置。要了解TraceSwitch更多的消息请查阅MSDN文档íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
<system.diagnostics>íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
       
<switches>íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
             
<add name="GWTrace" value="4"íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
/>íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
       
</switches>íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
</system.diagnostics>íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
需要注意的是上面两个小节都在system.web节点上面 íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
3)刚才定义了GwCfonfig自定义节点,这里用来放置CMP元数据,因为架构里的错误处理功能需要把错误信息保存到数据库里,所以错误处理所需要的元数据是必须的。另外这里给出了GuestBook容器的insert的元数据。你可以看一下元数据的结构,理解一下。因为很简单,相信你能很快写出相应的update,select,delete的元数据,记着,这些元数据和你刚刚写的存储过程是对应的。íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
<GWConfig>íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
       
<ContainerMappingSet>íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
             
<ContainerMapping>íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
                 
<ContainerMappingId>ERROR_LOG</ContainerMappingId>íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
                 
<ContainedClass>DbErrorEntry</ContainedClass>íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
                 
<Insert>íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
                     
<CommandName>GW_INSERT_ERRORLOG_SP</CommandName>íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
                     
<Parameter>íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
                           
<ClassMember>ErrorMessage</ClassMember>íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
                           
<ParameterName>@ErrorMessage</ParameterName>íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
                           
<DbTypeHint>Varchar</DbTypeHint>íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
                           
<ParamDirection>Input</ParamDirection>íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
                           
<Size>4000</Size>íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
                     
</Parameter>íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
                     
<Parameter>íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
                           
<ClassMember>ExtendedInfo</ClassMember>íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
                           
<ParameterName>@ExtendedInfo</ParameterName>íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
                           
<DbTypeHint>Varchar</DbTypeHint>íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
                           
<ParamDirection>Input</ParamDirection>íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
                           
<Size>4000</Size>íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
                     
</Parameter>íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
                     
<Parameter>íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
                           
<ClassMember>ServerName</ClassMember>íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
                           
<ParameterName>@ServerName</ParameterName>íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
                           
<DbTypeHint>Varchar</DbTypeHint>íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
                           
<ParamDirection>Input</ParamDirection>íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
                           
<Size>50</Size>íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
                     
</Parameter>íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
                     
<Parameter>íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
                           
<ClassMember>ErrorId</ClassMember>íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
                           
<ParameterName>@ErrorId</ParameterName>íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
                           
<DbTypeHint>Int</DbTypeHint>íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
                           
<ParamDirection>Output</ParamDirection>íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
                           
<Size>4</Size>íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
                     
</Parameter>íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
                 
</Insert>íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
                 
<Select>íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
                     
<CommandName>GW_GET_ERRORLOG_SP</CommandName>íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
                     
<Parameter>íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
                           
<ClassMember>StartDate</ClassMember>íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
                           
<ParameterName>@StartDate</ParameterName>íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
                           
<DbTypeHint>Date</DbTypeHint>íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
                           
<ParamDirection>Input</ParamDirection>íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
                           
<Size>8</Size>íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
                     
</Parameter>íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
                     
<Parameter>íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
                           
<ClassMember>EndDate</ClassMember>íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
                           
<ParameterName>@EndDate</ParameterName>íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
                           
<DbTypeHint>Date</DbTypeHint>íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
                           
<ParamDirection>Input</ParamDirection>íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
                           
<Size>8</Size>íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
                     
</Parameter>íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
                 
</Select>íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
             
</ContainerMapping>íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
             
<ContainerMapping>íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
                 
<ContainerMappingId>GuestBook</ContainerMappingId>íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
                 
<ContainedClass>GuestBookSet</ContainedClass>íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
                 
<Insert>íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
                     
<CommandName>insert_GuestBook</CommandName>íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
                     
<Parameter>íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
                           
<ClassMember>UserName</ClassMember>íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
                           
<ParameterName>@UserName</ParameterName>íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
                           
<DbTypeHint>NVarChar</DbTypeHint>íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
                           
<ParamDirection>Input</ParamDirection>íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
                           
<Size>10</Size>íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
                     
</Parameter>íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
                     
<Parameter>íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
                           
<ClassMember>Mail</ClassMember>íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
                           
<ParameterName>@Mail</ParameterName>íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
                           
<DbTypeHint>Varchar</DbTypeHint>íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
                           
<ParamDirection>Input</ParamDirection>íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
                           
<Size>50</Size>íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
                     
</Parameter>íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
                     
<Parameter>íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
                           
<ClassMember>Title</ClassMember>íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
                           
<ParameterName>@Title</ParameterName>íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
                           
<DbTypeHint>NVarChar</DbTypeHint>íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
                           
<ParamDirection>Input</ParamDirection>íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
                           
<Size>50</Size>íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi
íS ¾ £Hª;www.netcsharp.cnÅÑà’­×AŰi