DELPHI三层架构设计方案_第1页
DELPHI三层架构设计方案_第2页
DELPHI三层架构设计方案_第3页
DELPHI三层架构设计方案_第4页
DELPHI三层架构设计方案_第5页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、随便说说最近项目中的三层架构吧。讲点实际的东西。我最讨厌空讲道理。网上讲道理的太多了,不喜欢举例子。 大多数文章中都或多或少的讲到了三层架构。表示层,业务层,数据层。又把业务层 再细分,分为外观服务层,主业务服务,及数据库库服务层。今天主要讨论一下业务层吧。举个最简单的例子。客户端获取数据。 业务层要与表示层尽量解藕, 我的方法是:首先我们在中间层 TLB_ 中定义一个接口 IBusinessService, 定义一个方法。 getvoList ,我要得到一个 VO 的列表, VO 即 ValueObject, 例如:TValueObject= class(TPersistent)privat

2、eb_insertFlag :Boolean;b_updateFlag :Boolean;b_deleteFlag :Boolean;d_rowVersion :double;procedure setInsertFlag(pInsertFlag :Boolean);function getInsertFlag: Boolean;procedure setUpdateFlag(pUpdateFlag :Boolean);function getUpdateFlag: Boolean;procedure setDeleteFlag(pDeleteFlag :Boolean);function g

3、etDeleteFlag: Boolean;procedure setRowVersion(pRowV ersion :double);function getRowV ersion:double;protectedfunction GetOLEData: OleV ariant; virtual;procedure SetOLEData(const Value: OleVariant); virtual;publishedproperty bInsertFlag: Boolean read getInsertFlag write setInsertFlag;property bUpdateF

4、lag: Boolean read getUpdateFlag write setUpdateFlag; property bDeleteFlag: Boolean read getDeleteFlag write setDeleteFlag; property dRowVersion: double read getRowV ersion write setRowV ersion; property POLEData:OleV ariant read GetOLEData write SetOLEData; end;TUserVO = class(TV alueObject)privatei

5、d: string;name: string;password: string;。VO 的列表:TValueObjectList = Class(TObjectList)privateValueObject: TV alueObject;ClassName: TClass;procedure setClassName(pTmpClsName :TClass);function getClassName: TClass;procedure setValueObject(pTmpVO :TV alueObject);function getV alueObject: TV alueObject;p

6、rotectedfunction GetOLEData: OleV ariant; virtual;procedure SetOLEData(const Value: OleVariant); virtual;publishedfunction AddItem(index: integer; AObject: TObject ):Integer; virtual;function GetItem(index, itemid: integer ): TObject; virtual;function CountItem:Integer; virtual;publicconstructor Cre

7、ate; virtual;destructor Destroy; override;procedure AfterConstruction; override;property PClassName: TClass read getClassName write setClassName;property POLEData: OleV ariant read GetOLEData write SetOLEData; property PValueObject: TV alueObject read getValueObject write setV alueObject;end;TValueO

8、bjectList 就是 VO 的装载器。在 JAVA 中有一个好听的叫法,VOList 值列表组装器,具体的功能是可以管理VO , 当然你可以进行扩充,比如后来我加入了 OLETOBJECTTDataset 互换的功能。主键生成机制,分页存取功能,生成子集功能,及懒装载功能,压缩传输流功能等,同步数 据更新问题等。这要你自己去发挥吧。说了这么多,话题转回来吧。现在说客户端怎么去存取数据。 在前面中间层已经定义了 IBusinessService, 定义一个方法。 getvoList ,这个就是通用存取数 据的接口了。下面看看他的完整形式:procedure getvoList(const s

9、BOName: WideString; const sBOService: WideString; out voListObj: OleV ariant);这里有三个参数, sBOName:sBOService:voListObj: 干什么用的?第一个就是业务对象名称, 第二个是业务对象服务名称, 第三个是传回来的 olevariant;强调一点。 sBOName:sBOService: 这两个参数并不直接对应中间层的业务对象。之间 加了一个转换层。也就是 service 定位层。这个东西把客户传来的两个参数定位到相应的业务对象中。 有什么好处呢。 其实就相当于客户端和中间层的一个简单的协议,

10、 客户端发一个bon ame,个服务名,这都是约定的。也就是不变的。以后该业务要变,就十分方便,只需要在中间层的定位器,配置一下就可以了,如果采用 XML 或文件配置,不需要修改任何程 序,客户的业务已经发生改变。当然会采用名字调用等技术了。相关代码如下:TBOService= class(TServiceObject)private/srvOBName : String;IBasBO: IBaseBO;BOPool: TBOPrototype; / 业务对象持久池:publicconstructor Create;procedure getvoList(const sBOName: Wide

11、String; const sBOService: WideString;out voListObj: OleV ariant); safecall;。再说说 TBOPrototype 吧 ,这个东西是管理业务对象池的。 由他统一创建业务对象。 用的是单例模式。之后具体的调用,相关代码如下:if FindClass(fClsPer.ClassName) nil thenbegintmpPer := TPersistentClass(FindClass(fClsPer.ClassName).Create;Supports(tmpPer, StringToGUID(3AE5EA91-41EA-41

12、E7-B40C-CF00F8B75F8A),IBasBO);tryIBasBO.InitBusinessObj;voListObj := IBasBO.GetDAOV alueObject.getDAOV alueList;finallyIBasBO := nil;end;endelseShowMessage(no found!);其中IBasBO,是一个接口定义,IBaseBO = interface(IUnknown)3AE5EA91-41EA-41E7-B40C-CF00F8B75F8Afunction GetObject: TObject;procedure SetObject( va

13、lue: TObject );function GetDAOV alueObject: TDAOV alueObject;procedure SetDAOValueObject(tmpDAOVO: TDAOV alueObject);procedure InitBusinessObj;end;呵呵,现在可以看到冰山一角了吧。经过业务对象初始化之后,他就去创建 DAO 了。呵呵。 如果你不了解 DAO ,看看 相关的资料吧。 。主要功能就是把数据存储隐藏起来,调用SQL, ORACLE ,之类。我主要是用它调用数据库工厂创建。大致看一下代码吧。/1. 工厂基类 (SQLServer 工厂类)/

14、unit ConnDBFactory_SQLServer;interfaceusesClasses, ADODB, ConnDB, DB, DBTables, Controls, Dialogs, IConnDB, ConnDBFactory;typeTConnBDEDBFactory_SQLServer = class(TConnDBFactory)publicfunction CreatorConnDB() :IConnDataBase; override;end;TConnADODBFactory_SQLServer = class(TConnDBFactory)publicfuncti

15、on CreatorConnDB() :IConnDataBase; override;end;又扯远了, 还是再回来吧。 中间层的定位器通用业务对象管理器创建或获得一个业务对象之 后,定位到相应的服务上去。 比如数据存取。 这里有一点说明: 就是业务对象的数据存取和 业务服务是分开的。 数据存取就采用 DAO 的方法。直接一点说就是创建 DAO 对象。这是 TDAOV alueObject= class(TPersistent, IDAOV alueObject)private.上面的是基类。完成基础服务的。看看接口吧。IDAOV alueObject = interface(IUnknow

16、n) DF03C9E7-2A5B-4E32-8EF5-C4E8FC77E8BB function createDAOV alue: TValueObject;function insertDAOV alue(pValueObject: TV alueObject): Integer;function updateDAOV alue(pValueObject: TV alueObject) :Integer;function deleteDAOV alue(pValueObject: TV alueObject) :Integer;function findByPrimaryKey(const

17、pServiceName: WideString; vKey: OleV ariant): TValueObject;function getDAOV alueList: OleV ariant; overload;function getDAOV alueList(sSQL: String): OleV ariant; overload; 。看看干了什么。 。inherited Create;sqlAnySrvObj := TSQLAnalyzeService.Create;if not assigned(VOList) thenVOList := TV alueObjectList;VOL

18、ist.pVOClassName := TUSERVO创建了一个 SQL 分析器。 一个 VOLIST 对象, 并且传了一个 VO 名字。TSQLAnalyzeService , SQL 分析器可以动态的生成 SQL 脚本。再看看function getDAOV alueList: OleV ariant; overload;function getDAOV alueList(sSQL: String): OleV ariant; 这两个函式吧。 把生成的 VO, olevariant 化。 这些基础的工作, 已经由 VOLIST 做了。重要的一点:prepareTable,这是VOLIST中的函式,由他动态的生成 TDATASET ,当然没必要在 中间层生成。但可以打包传给客户端,就 OK 了。现在在看一下客户端的代码吧:MyInterface2.getvoList(TUserBO, , oo);pp := TValueObjectList.Create; pp.OLEToDS(o

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论