淺析多層結(jié)構(gòu)及其在Delphi中的實(shí)現(xiàn)

時(shí)間:2022-05-26 07:55:00

導(dǎo)語:淺析多層結(jié)構(gòu)及其在Delphi中的實(shí)現(xiàn)一文來源于網(wǎng)友上傳,不代表本站觀點(diǎn),若需要原創(chuàng)文章可咨詢客服老師,歡迎參考。

淺析多層結(jié)構(gòu)及其在Delphi中的實(shí)現(xiàn)

二層結(jié)構(gòu)的退出

在傳統(tǒng)的二層C/S結(jié)構(gòu)數(shù)據(jù)庫應(yīng)用中,客戶端的機(jī)器執(zhí)行應(yīng)用程序,連接到后端的數(shù)據(jù)庫服務(wù)器中存取應(yīng)用系統(tǒng)所需資料,因?yàn)閼?yīng)用系統(tǒng)的企業(yè)邏輯都編寫在客戶端的應(yīng)用程序中,造成客戶端非常臃腫,且當(dāng)應(yīng)用系統(tǒng)需求改變時(shí),所有在客戶端的應(yīng)用程序都必須改變,使維護(hù)成本太高。

Oracle

MSQL

客戶端1數(shù)據(jù)庫服務(wù)器Sybase等

圖一2層C/S結(jié)構(gòu)

1.2多層結(jié)構(gòu)的概念和特點(diǎn)

為了解決這些問題,多層結(jié)構(gòu)應(yīng)用體系應(yīng)運(yùn)而生,即在傳統(tǒng)的二層C/S模型中放入應(yīng)用程序服務(wù)器。應(yīng)用程序服務(wù)器簡單地說就是一個(gè)包含企業(yè)邏輯的應(yīng)用程序,開發(fā)人員以一種特定的組件形態(tài),如MicrosoftCOM/DCOM,CORBA對象,或EnterpriseJAVABean等,封裝企業(yè)邏輯的程序代碼,這種經(jīng)過封裝,能夠執(zhí)行特定企業(yè)功能的對象被稱為“企業(yè)對象”,把這些企業(yè)對象分發(fā)到應(yīng)用程序服務(wù)器中,開發(fā)人員在開發(fā)應(yīng)用程序時(shí)就可以使用這些企業(yè)對象提供的服務(wù)。

多層結(jié)構(gòu)的典型是三層結(jié)構(gòu),其基本思想是把用戶界面與企業(yè)邏輯分離。整體結(jié)構(gòu)如圖二所示。

客戶端應(yīng)用程序服務(wù)器遠(yuǎn)程數(shù)據(jù)庫服務(wù)器

(提供用戶界面)(包含企業(yè)邏輯)(Oracle,MSQL,Sybase等DBMS)

圖二三層結(jié)構(gòu)模型

(1)客戶端應(yīng)用程序。提供用戶接口,主要功能是指導(dǎo)操作人員使用界面,輸入數(shù)據(jù),輸出結(jié)果,并不具有企業(yè)邏輯,或只擁有部分不涉及企業(yè)核心的、機(jī)密的應(yīng)用邏輯。這樣客戶端就顯的很廋,稱為“廋”客戶。

(2)應(yīng)用程序服務(wù)器。它是應(yīng)用的主體,包含了企業(yè)中核心的及易變的企業(yè)邏輯(規(guī)劃,運(yùn)作方法,管理模型等),其功能即接受輸入,處理后返回結(jié)果。

(3)遠(yuǎn)程數(shù)據(jù)庫服務(wù)器。即數(shù)據(jù)庫管理系統(tǒng)(DBMS),負(fù)責(zé)管理對數(shù)據(jù)的讀寫和維護(hù)。

在更復(fù)雜的多層體系結(jié)構(gòu)中,“廋”客戶與遠(yuǎn)程數(shù)據(jù)庫服務(wù)器之間可以加入更多的中間服務(wù)器,如加入一個(gè)中間安全服務(wù)器或中間轉(zhuǎn)換服務(wù)器,用于對不同平臺數(shù)據(jù)進(jìn)行處理。

分布式多層結(jié)構(gòu)把整個(gè)應(yīng)用系統(tǒng)的執(zhí)行分成數(shù)個(gè)不同部分并且執(zhí)行在不同的機(jī)器中。其中應(yīng)用程序服務(wù)器作為中間層集中實(shí)現(xiàn)企業(yè)邏輯,協(xié)調(diào)多層之間的請求,并掌握數(shù)據(jù)集定義的全部細(xì)節(jié)和遠(yuǎn)程數(shù)據(jù)庫服務(wù)器進(jìn)行通信,這樣客戶端應(yīng)用程序就重點(diǎn)放在顯示數(shù)據(jù)和與用戶交互上,客戶端應(yīng)用程序甚至都不需要知道數(shù)據(jù)在那兒。

具體來說,多層結(jié)構(gòu)具有如下優(yōu)點(diǎn):

(1)在一個(gè)共享的中間層封裝了企業(yè)邏輯,不同客戶端應(yīng)用程序可以共享同一個(gè)中層層,而不必由每個(gè)客戶端應(yīng)用程序單獨(dú)實(shí)現(xiàn)企業(yè)邏輯。

(2)客戶端應(yīng)用程序可以做的很廋。因?yàn)楹芏鄰?fù)雜的工作由應(yīng)用程序服務(wù)器代勞,客戶端應(yīng)用程序只需關(guān)注用戶界面本身?!皬C”客戶端應(yīng)用程序更易、安裝、配置和維護(hù)。

(3)實(shí)現(xiàn)分布式數(shù)據(jù)處理。把一個(gè)應(yīng)用程序分布在幾個(gè)機(jī)器上運(yùn)行,可以提供應(yīng)用程序的性能,通過冗余配置還可以保證不會因?yàn)榫植抗收蠈?dǎo)致整個(gè)應(yīng)用程序崩潰。

(4)有利于安全。將一些敏感數(shù)據(jù)功能部分封裝在中間層,并授予不同訪問權(quán)限,可以保證對數(shù)據(jù)的訪問限制。

1.3多層結(jié)構(gòu)使用的技術(shù)。

目前分布式多層結(jié)構(gòu)使用的核心大致可以分為兩種不同的工業(yè)標(biāo)準(zhǔn),即Microsoft制定的COM/DCOM/COM+和由700多家廠商共同提倡的CORBA。因分布式結(jié)構(gòu)的廣泛流行,現(xiàn)也有愈來愈多的根據(jù)這兩種分布式核心技術(shù)加以演進(jìn)而產(chǎn)生的分布式技術(shù),如EJB(EnterpriseJavaBean)等。

Microsoft的COM/DCOM/COM+是以Windows為中心的開發(fā)環(huán)境,CORBA是平臺中立的分布式技術(shù),CORBA能夠執(zhí)行于Windows,UNIX以及Linux等操作系統(tǒng)中。這些技術(shù)都能使開發(fā)人員在應(yīng)用程序中輕易地使用企業(yè)對象所提供的服務(wù)。這兩種分布式技術(shù)都在客戶端機(jī)器中以一個(gè)特別的對象來仿真真正的遠(yuǎn)程應(yīng)用程序服務(wù)器上的企業(yè)對象,這樣客戶端應(yīng)用程序就可以調(diào)用在客戶端機(jī)器中的仿真對象,該對象再使用特定的通訊協(xié)議來真正調(diào)用遠(yuǎn)程應(yīng)用服務(wù)器上的企業(yè)對象,從而調(diào)用遠(yuǎn)程企業(yè)對象的服務(wù),以滿足客戶端的要求。

2在delphi中實(shí)現(xiàn)基于MIDAS的多層結(jié)構(gòu)

2.1在Delphi中多層結(jié)構(gòu)的實(shí)現(xiàn)

在Delphi中多層結(jié)構(gòu)的基礎(chǔ)是MIDAS(Multi-tierDistributedApplicationServiceSuite,多層分布式應(yīng)用服務(wù)器組)技術(shù)。MIDAS是一些不同技術(shù)的集合,無論是應(yīng)用程序服務(wù)器還是客戶端,MIDAS技術(shù)需要DBClient.dll和MIDAS.dll的支持,這兩個(gè)動態(tài)鏈接庫用于管理數(shù)據(jù)包,MIDAS應(yīng)用程序時(shí)需要這個(gè)文件。

基于MIDAS的多層結(jié)構(gòu)依然分為客戶端應(yīng)用程序,應(yīng)用程序服務(wù)器和遠(yuǎn)程數(shù)據(jù)庫服務(wù)器,如圖三所示。

從圖三可見,MIDAS的數(shù)據(jù)庫應(yīng)用程序需要一些特殊組件,這些組件共分為4類:

(1)遠(yuǎn)程數(shù)據(jù)模塊。位于服務(wù)器端,作為COM服務(wù)器或CORBA服務(wù)器讓客戶端應(yīng)用程序訪問它的接口。

數(shù)據(jù)模塊IAppServer接口遠(yuǎn)程數(shù)據(jù)模塊

客戶端應(yīng)用程序應(yīng)用程序服務(wù)器遠(yuǎn)程數(shù)據(jù)庫服務(wù)器

圖三MIDAS結(jié)構(gòu)

(2)DataSetProvider組件。位于服務(wù)器端,提供IAppServer接口,客戶端應(yīng)用程序通過

IAppServe接口獲得數(shù)據(jù)。

(3)連接組件。位于客戶端,包括DCOMConnection,SocketConnection,CORBAConnection,

OLEnterpriseConnection,MIDASConnection和RemoteServer等連接組件,為客戶端應(yīng)用程序定位應(yīng)用程序服務(wù)器和IAppServe接口。

(4)ClientDataSet組件。位于客戶端,訪問服務(wù)器端的IAppServe接口,它是從TdataSet繼承下來的組件。

客戶端應(yīng)用程序通過IAppServe接口與應(yīng)用程序服務(wù)器通訊,通訊協(xié)議為DCOM,TCP/IP,HTTP,OLEnterprise和CORBA。通訊協(xié)議因客戶端的MIDAS連接組件及應(yīng)用程序服務(wù)器上的遠(yuǎn)程模塊不同而不同。

2.1.1客戶端應(yīng)用程序結(jié)構(gòu)

在結(jié)構(gòu)上,客戶端應(yīng)用程序通過標(biāo)準(zhǔn)數(shù)據(jù)控制組件與用戶交互,但是它是通過應(yīng)用程序服務(wù)器提供的IAppServe接口獲得數(shù)據(jù),也是通過IAppServe接口更新數(shù)據(jù)。所謂“廋”客戶即指不依賴BDE的數(shù)據(jù)集(TClientDataSet組件)構(gòu)成的客戶端應(yīng)用程序。TClientDataSet組件是從TDataSet派生出來的客戶端數(shù)據(jù)集組件,它扮演了與TTable或TQuery同樣的角色,但它不需要BDE,它把通過IAppServe接口獲得的數(shù)據(jù)在客戶端內(nèi)存中建立副本,對數(shù)據(jù)進(jìn)行操作。直接訪問遠(yuǎn)程數(shù)據(jù)庫服務(wù)器的是應(yīng)用程序服務(wù)器。

遠(yuǎn)程數(shù)據(jù)模塊說明

RemoteDataModule支持雙重接口的自動化服務(wù)器,支持DCOM,TCP/IP或OLEnterprise協(xié)議。

MTSDataMoudle支持雙重接口的自動化服務(wù)器,創(chuàng)建的應(yīng)用程序服務(wù)器是動態(tài)鏈接庫,支持DCOM,TCP/IP或OLEnterpris協(xié)議。

CORBADataMouduleCORBA服務(wù)器,支持CORBA協(xié)議

在客戶端,MIDAS連接組件非常重要,不同連接組件使用不同的通訊協(xié)議,如表一所示。

連接組件通訊協(xié)議

DCOMConnectionDCOM

SocketConnectionTCP/IP

WebConnectionHTTP

OLEnterpriseOLEnterprise

CORBAConnectionCORBA

表一MIDAS連接方式表二支持MIDAS的數(shù)據(jù)模塊

2.1.2應(yīng)用程序服務(wù)器

應(yīng)用程序服務(wù)器的關(guān)鍵部件是遠(yuǎn)程數(shù)據(jù)模塊,在遠(yuǎn)程數(shù)據(jù)模塊上,TTable,TQuery等BDE數(shù)據(jù)集組件通過BDE與遠(yuǎn)程數(shù)據(jù)庫服務(wù)器連接訪問數(shù)據(jù)庫,DataSetProvider組件輸出IAppServer接口,DataSetProvider組件通過DataSet屬性與數(shù)據(jù)集組件相連,這樣客戶端通過IAppServer接口就可以訪問數(shù)據(jù)。

Delphi支持三種類型的遠(yuǎn)程數(shù)據(jù)模塊,如表二示。

2.2用MIDAS創(chuàng)建多層結(jié)構(gòu)數(shù)據(jù)庫應(yīng)用程序?qū)嵗?/p>

建立多層結(jié)構(gòu)應(yīng)用系統(tǒng),必須先建立應(yīng)用程序服務(wù)器,并運(yùn)行注冊之,再建立客戶端。下面就以筆者創(chuàng)建的一個(gè)三層結(jié)構(gòu)為例來介紹用Delphi實(shí)現(xiàn)三層結(jié)構(gòu)的步驟。(假設(shè)在應(yīng)用程序服務(wù)器上已設(shè)好BDE連接,連到遠(yuǎn)程數(shù)據(jù)庫服務(wù)器。)

2.2.1建立應(yīng)用程序服務(wù)器。(在應(yīng)用程序服務(wù)器上建立)

(1)使用File菜單下的NewApplication建立一個(gè)新應(yīng)用程序。

(2)創(chuàng)建遠(yuǎn)程模塊。使用File菜單下的New打開NewItems對話框,在Multitier選項(xiàng)下,雙擊RemoteDataModule,設(shè)置Classname為rdm,Instancing及ThreadingModule屬性取默認(rèn)值。

(3)在該遠(yuǎn)程模塊上放一個(gè)Query1(Tqueyr組件),DatabaseName屬性中指定為要訪問的數(shù)據(jù)庫,如“出版社”。在該遠(yuǎn)程模塊上再增加一個(gè)DataSetProvider1(TDataSetProvider組件),DataSet屬性設(shè)為Query1,Options屬性中令poAlloCommandtext為true。(設(shè)為true,則客戶端應(yīng)用程序中TClientDataSet的屬性commandtext中的SQL語句就可以通過IAppServer接口傳遞。)

至此,應(yīng)用程序服務(wù)器已創(chuàng)建完畢,運(yùn)行該應(yīng)用程序服務(wù)器在系統(tǒng)中注冊它,在應(yīng)用程序服務(wù)器上運(yùn)行ScktSrvr.exe文件,這樣今后客戶端程序就可以調(diào)用該應(yīng)用程序服務(wù)器。

2.2.2創(chuàng)建客戶端應(yīng)用程序。(在客戶端機(jī)器上創(chuàng)建)

(1)建立數(shù)據(jù)模塊。使用File菜單下的NewApplication建立一個(gè)新應(yīng)用程序。在NewItem中雙擊DataModule建立一個(gè)數(shù)據(jù)模塊(命名為dm),在該模塊上放一個(gè)連接組件SocketConnection1(TsocketConnection組件),其IP屬性中指定應(yīng)用程序服務(wù)器的IP地址,在Port屬性中取默認(rèn)值211,在ServerName屬性中設(shè)置應(yīng)用程序服務(wù)器(在這里,應(yīng)用程序服務(wù)器就是上面創(chuàng)建的名為rdm的應(yīng)用程序服務(wù)器。),這樣就可以定位應(yīng)用程序服務(wù)器和IAppServer接口。在dm數(shù)據(jù)模塊上再增加一個(gè)ClientDataSet1(TClientDataSet組件),其RemoteServer屬性設(shè)為SocketConnection1,ProviderName為DataSetProvider1。保存該unit為dm。

(2)創(chuàng)建用戶界面。使用File菜單下的NewForm新建一個(gè)unit,在該unit中引用上面建立的數(shù)據(jù)模塊單元dm。在用戶界面Form上添加DataSource1(TdataSource組件),其DataSet

屬性設(shè)為dm.ClientDataSet1,即上面數(shù)據(jù)模塊中的客戶端數(shù)據(jù)集組件。添加一個(gè)DBGrid1(TDBGrid組件),DataSource屬性設(shè)為DataSource1。添加一個(gè)Btton1組件,caption屬性為“查詢”,其click事件中程序代碼為:

procedureTForm1.Button1click(sender:Tobject);

begin

withdm.ClientDataSet1do

begin

close;

commandtext:=’select*from書’;

open;

end;

end;

至此該三層結(jié)構(gòu)已創(chuàng)建完畢,保存運(yùn)行客戶端應(yīng)用程序,點(diǎn)擊查詢按鈕(即Btton1按鈕),則客戶端應(yīng)用程序?qū)⒓せ顟?yīng)用服務(wù)器程序,通過IAppServer接口把dm.ClientDataSet1中的SQL語句傳到Query1,Query1通過BDE訪問數(shù)據(jù)庫服務(wù)器,查到的數(shù)據(jù)再通過IAppServer接口傳給dm.ClientDataSet1,并在DBGrid1上顯示出來。

3結(jié)束語

多層結(jié)構(gòu)是因網(wǎng)絡(luò)發(fā)展的需要而出現(xiàn)的產(chǎn)物,運(yùn)用面向?qū)ο蠹夹g(shù),分離用戶界面和企業(yè)邏輯,解決了兩層結(jié)構(gòu)的維護(hù)成本高,客戶端臃腫等弊端,且改善了延展性。在Delphi中采用MIDAS技術(shù),運(yùn)用COM/DCOM/COM+或CORBA標(biāo)準(zhǔn),為多層結(jié)構(gòu)的開發(fā)提供了強(qiáng)大功能,增加了開發(fā)人員的生產(chǎn)力。