DELPHI三層架構(gòu)設(shè)計方案_第1頁
DELPHI三層架構(gòu)設(shè)計方案_第2頁
DELPHI三層架構(gòu)設(shè)計方案_第3頁
DELPHI三層架構(gòu)設(shè)計方案_第4頁
DELPHI三層架構(gòu)設(shè)計方案_第5頁
免費預(yù)覽已結(jié)束,剩余1頁可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、隨便說說最近項目中的三層架構(gòu)吧。講點實際的東西。我最討厭空講道理。網(wǎng)上講道理的太多了,不喜歡舉例子。 大多數(shù)文章中都或多或少的講到了三層架構(gòu)。表示層,業(yè)務(wù)層,數(shù)據(jù)層。又把業(yè)務(wù)層 再細(xì)分,分為外觀服務(wù)層,主業(yè)務(wù)服務(wù),及數(shù)據(jù)庫庫服務(wù)層。今天主要討論一下業(yè)務(wù)層吧。舉個最簡單的例子??蛻舳双@取數(shù)據(jù)。 業(yè)務(wù)層要與表示層盡量解藕, 我的方法是:首先我們在中間層 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 , 當(dāng)然你可以進(jìn)行擴(kuò)充,比如后來我加入了 OLETOBJECTTDataset 互換的功能。主鍵生成機(jī)制,分頁存取功能,生成子集功能,及懶裝載功能,壓縮傳輸流功能等,同步數(shù) 據(jù)更新問題等。這要你自己去發(fā)揮吧。說了這么多,話題轉(zhuǎn)回來吧。現(xiàn)在說客戶端怎么去存取數(shù)據(jù)。 在前面中間層已經(jīng)定義了 IBusinessService, 定義一個方法。 getvoList ,這個就是通用存取數(shù) 據(jù)的接口了。下面看看他的完整形式:procedure getvoList(const s

9、BOName: WideString; const sBOService: WideString; out voListObj: OleV ariant);這里有三個參數(shù), sBOName:sBOService:voListObj: 干什么用的?第一個就是業(yè)務(wù)對象名稱, 第二個是業(yè)務(wù)對象服務(wù)名稱, 第三個是傳回來的 olevariant;強(qiáng)調(diào)一點。 sBOName:sBOService: 這兩個參數(shù)并不直接對應(yīng)中間層的業(yè)務(wù)對象。之間 加了一個轉(zhuǎn)換層。也就是 service 定位層。這個東西把客戶傳來的兩個參數(shù)定位到相應(yīng)的業(yè)務(wù)對象中。 有什么好處呢。 其實就相當(dāng)于客戶端和中間層的一個簡單的協(xié)議,

10、 客戶端發(fā)一個bon ame,個服務(wù)名,這都是約定的。也就是不變的。以后該業(yè)務(wù)要變,就十分方便,只需要在中間層的定位器,配置一下就可以了,如果采用 XML 或文件配置,不需要修改任何程 序,客戶的業(yè)務(wù)已經(jīng)發(fā)生改變。當(dāng)然會采用名字調(diào)用等技術(shù)了。相關(guān)代碼如下:TBOService= class(TServiceObject)private/srvOBName : String;IBasBO: IBaseBO;BOPool: TBOPrototype; / 業(yè)務(wù)對象持久池:publicconstructor Create;procedure getvoList(const sBOName: Wide

11、String; const sBOService: WideString;out voListObj: OleV ariant); safecall;。再說說 TBOPrototype 吧 ,這個東西是管理業(yè)務(wù)對象池的。 由他統(tǒng)一創(chuàng)建業(yè)務(wù)對象。 用的是單例模式。之后具體的調(diào)用,相關(guān)代碼如下: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;呵呵,現(xiàn)在可以看到冰山一角了吧。經(jīng)過業(yè)務(wù)對象初始化之后,他就去創(chuàng)建 DAO 了。呵呵。 如果你不了解 DAO ,看看 相關(guān)的資料吧。 。主要功能就是把數(shù)據(jù)存儲隱藏起來,調(diào)用SQL, ORACLE ,之類。我主要是用它調(diào)用數(shù)據(jù)庫工廠創(chuàng)建。大致看一下代碼吧。/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;又扯遠(yuǎn)了, 還是再回來吧。 中間層的定位器通用業(yè)務(wù)對象管理器創(chuàng)建或獲得一個業(yè)務(wù)對象之 后,定位到相應(yīng)的服務(wù)上去。 比如數(shù)據(jù)存取。 這里有一點說明: 就是業(yè)務(wù)對象的數(shù)據(jù)存取和 業(yè)務(wù)服務(wù)是分開的。 數(shù)據(jù)存取就采用 DAO 的方法。直接一點說就是創(chuàng)建 DAO 對象。這是 TDAOV alueObject= class(TPersistent, IDAOV alueObject)private.上面的是基類。完成基礎(chǔ)服務(wù)的。看看接口吧。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創(chuàng)建了一個 SQL 分析器。 一個 VOLIST 對象, 并且傳了一個 VO 名字。TSQLAnalyzeService , SQL 分析器可以動態(tài)的生成 SQL 腳本。再看看function getDAOV alueList: OleV ariant; overload;function getDAOV alueList(sSQL: String): OleV ariant; 這兩個函式吧。 把生成的 VO, olevariant 化。 這些基礎(chǔ)的工作, 已經(jīng)由 VOLIST 做了。重要的一點:prepareTable,這是VOLIST中的函式,由他動態(tài)的生成 TDATASET ,當(dāng)然沒必要在 中間層生成。但可以打包傳給客戶端,就 OK 了?,F(xiàn)在在看一下客戶端的代碼吧:MyInterface2.getvoList(TUserBO, , oo);pp := TValueObjectList.Create; pp.OLEToDS(o

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論