吳 澤
[摘 要]三層模式在網(wǎng)站開發(fā)方面已經(jīng)非常普及,在整個(gè)軟件開發(fā)業(yè)也非常流行,其優(yōu)點(diǎn)正得到越來越多的人的認(rèn)可。本文簡(jiǎn)單介紹了.Net的3層結(jié)構(gòu)劃分及各層的數(shù)據(jù)處理。1
[關(guān)鍵詞] .Net 三層體系 數(shù)據(jù)
一、.Net概述
.Net技術(shù)是2000年6月由微軟公司推出的,并為了推廣.Net技術(shù)的應(yīng)用,于同年9月又推出了企業(yè)服務(wù)器,并在以后幾乎所有的虛擬設(shè)備上打了.Net的標(biāo)簽。但是由于對(duì)市場(chǎng)策略定位不明晰,人們對(duì).Net技術(shù)的概念并不明確。使得2003年之后.Net逐漸被廣泛理解和應(yīng)用。
簡(jiǎn)單的說,.Net框架是一種新的計(jì)算機(jī)平臺(tái),它在各個(gè)方面簡(jiǎn)化了在分布式Internet環(huán)境中的應(yīng)用程序的開發(fā),嶄新的開發(fā)工具Visual Studio.NET的推出,更是使許多曾經(jīng)讓人望而生畏的編程變得簡(jiǎn)單、明了。.NET正深刻地影響著現(xiàn)有的開發(fā)模式和開發(fā)方法。
所謂三層體系結(jié)構(gòu),是在客戶端與數(shù)據(jù)庫(kù)之間加入了一個(gè)"中間層",也叫組件層。不是簡(jiǎn)單地放置三臺(tái)機(jī)器就是三層體系結(jié)構(gòu),也不僅僅有B/S應(yīng)用才是三層體系結(jié)構(gòu),三層是指邏輯上的三層,即這三個(gè)層放置到一臺(tái)機(jī)器上。
三層體系的應(yīng)用程序?qū)I(yè)務(wù)規(guī)則、數(shù)據(jù)訪問、合法性校驗(yàn)等工作放到了中間層進(jìn)行處理。通常情況下,客戶端不直接與數(shù)據(jù)庫(kù)進(jìn)行交互,而是通過COM/DCOM通訊與中間層建立連接,再經(jīng)由中間層與數(shù)據(jù)庫(kù)進(jìn)行交互。
在多層分布式應(yīng)用中,在客戶端和服務(wù)器之間加入了一層或多層應(yīng)用服務(wù)程序,這種程序稱為"應(yīng)用服務(wù)器"。開發(fā)人員可以將應(yīng)用的商業(yè)邏輯放在中間層應(yīng)用服務(wù)器上,把應(yīng)用的業(yè)務(wù)邏輯與用戶界面分開。在保證客戶端功能的前提下,為用戶提供一個(gè)簡(jiǎn)潔的界面。這意味著如果需要修改應(yīng)用程序代碼,只需要對(duì)中間層應(yīng)用服務(wù)器進(jìn)行修改,而不用修改成千上萬的客戶端應(yīng)用程序。從而使開發(fā)人員可以專注于應(yīng)用系統(tǒng)核心業(yè)務(wù)邏輯的分析、設(shè)計(jì)和開發(fā),簡(jiǎn)化了應(yīng)用系統(tǒng)的開發(fā)、更新和升級(jí)工作。
二、.Net 層設(shè)計(jì)
面向?qū)ο蟮?、基于模塊化的組件設(shè)計(jì)需要能夠方便地修改應(yīng)用程序的各個(gè)部分。完成這一目標(biāo)的一種好方法就是在層上工作,將一個(gè)應(yīng)用程序的主要功能分離到不同的層或者級(jí)中。.Net Framework為創(chuàng)建可維護(hù)、可擴(kuò)展的層模式提供了豐富的支持,使得N層夠架取代傳統(tǒng)的客戶機(jī)/服務(wù)器模式而與Internet緊密結(jié)合。
三、分層模型
從本質(zhì)上講,層代表了一個(gè)應(yīng)用程序主要的功能。一般地,我們將應(yīng)用程序功能分為三個(gè)方面,對(duì)應(yīng)3層架構(gòu)模式。它們是數(shù)據(jù)層、商務(wù)層和表示層。
數(shù)據(jù)層:包含數(shù)據(jù)存儲(chǔ)和與它交互的組件或服務(wù)。這些組件和服務(wù)在功能上和中間層相互獨(dú)立。
中間層:包括一個(gè)或者多個(gè)組件服務(wù),它們應(yīng)用商務(wù)規(guī)則、實(shí)現(xiàn)應(yīng)用程序邏輯并完成應(yīng)用程序運(yùn)行所需要的數(shù)據(jù)處理。作為這個(gè)過程的一部分,中間層負(fù)責(zé)處理來自數(shù)據(jù)存儲(chǔ)或者發(fā)送給數(shù)據(jù)存儲(chǔ)的數(shù)據(jù)。
表示層:從中間層獲得信息并顯示給用戶。該層同時(shí)也負(fù)責(zé)和用戶進(jìn)行交互,比返回的信息并將信息回送給中間層進(jìn)行處理。
可見,數(shù)據(jù)層從數(shù)據(jù)庫(kù)中獲得較為原始的數(shù)據(jù),商務(wù)層把數(shù)據(jù)轉(zhuǎn)換成符合商務(wù)規(guī)則的有意義的信息,表示層把信息轉(zhuǎn)換成對(duì)于用戶有意義的內(nèi)容。數(shù)據(jù)層和中間層之間的分離就顯而易見--它們之間通過網(wǎng)絡(luò)連接。這種分層設(shè)計(jì)方式很實(shí)用,因?yàn)槊恳粚佣伎梢元?dú)立地修改。我們可以修改商務(wù)層,不斷地從數(shù)據(jù)層接受相同的數(shù)據(jù),并把這些數(shù)據(jù)傳遞到表示層,我們也可以修改表示層,使得對(duì)于站點(diǎn)外觀的修改不必改動(dòng)下面的商務(wù)層邏輯。
四、常用的N層模型設(shè)計(jì)
一個(gè)N層應(yīng)用程序中的層不是由運(yùn)行應(yīng)用程序的物理結(jié)構(gòu)(硬件)定義的。層是應(yīng)用程序運(yùn)行的一個(gè)邏輯方面的功能,并定義應(yīng)用程序?qū)?zhí)行的不同的任務(wù)階段。
(一)設(shè)計(jì)一個(gè)簡(jiǎn)單的三層
最簡(jiǎn)單的N層模型就是三層。我們有一個(gè)被網(wǎng)絡(luò)分隔開的服務(wù)器和客戶機(jī)。服務(wù)器中含有數(shù)據(jù)存儲(chǔ)和組成數(shù)據(jù)層的數(shù)據(jù)訪問組件,已經(jīng)組成中間層的商務(wù)邏輯。客戶機(jī)作為表示層只需要給應(yīng)用程序提供界面即可。
在這個(gè)最簡(jiǎn)單的情況中我們或許有一個(gè)關(guān)系數(shù)據(jù)庫(kù)或者一組訪問數(shù)據(jù)的組件或者存儲(chǔ)過程。然后我們應(yīng)當(dāng)有一個(gè)訪問組件或者存儲(chǔ)過程的asp.net頁(yè)面來提取信息,處理和格式化信息使之適合于客戶機(jī),然后通過網(wǎng)絡(luò)將信息傳送給客戶機(jī)??蛻魴C(jī)做的事情就是顯示信息、收集用戶的輸入和將信息回送給中間層。
(二)設(shè)計(jì)N層
很明顯,上面的情況假定了兩件事:一是客戶機(jī)為一個(gè)低端設(shè)備不參與應(yīng)用程序中所需的實(shí)際數(shù)據(jù)處理;另外就是只有一組商務(wù)規(guī)則。
但是,這些并不符合實(shí)際的應(yīng)用程序。例如,"中間層"的真正意思是商務(wù)邏輯本身,并且,商務(wù)邏輯的不同元素可以無可非議地存在于不同的服務(wù)器中。我們通常期望商務(wù)規(guī)則在其他某個(gè)地方而非在中間層中。這樣在提取數(shù)據(jù)過程的前期實(shí)現(xiàn)某個(gè)商務(wù)邏輯比較恰當(dāng),當(dāng)然我們也可以在訪問數(shù)據(jù)存儲(chǔ)的組件中實(shí)現(xiàn)商務(wù)邏輯。這個(gè)商務(wù)邏輯"包"因此能和數(shù)據(jù)存儲(chǔ)在同一個(gè)服務(wù)器上,甚至在另外一個(gè)中間服務(wù)器上。
另外,為了充分利用"胖客戶機(jī)"的一些性能,以便減少網(wǎng)絡(luò)負(fù)載和因訪問路徑循環(huán)而導(dǎo)致的遲滯,我們可以將一些商務(wù)邏輯放在客戶機(jī)上。
對(duì)于客戶機(jī),這個(gè)提供了與原始對(duì)象相同的方法和屬性。然而,當(dāng)客戶機(jī)與代理對(duì)象相互作用時(shí),調(diào)用被自動(dòng)串行化,并通過網(wǎng)絡(luò)傳送給服務(wù)器上的對(duì)象。然后,任何響應(yīng)和結(jié)果通過通道被傳送回客戶機(jī)。
這兩個(gè)遠(yuǎn)程技術(shù)都允許客戶機(jī)使用原來在服務(wù)器上創(chuàng)建的對(duì)象。我們能夠串行化一個(gè)DataSet對(duì)象或者Xml文檔,同時(shí)我們也能串行化其它的如集合這樣的對(duì)象(如一個(gè)哈希表等)。
這種模式?jīng)]有中間存儲(chǔ)并且?guī)缀醪恍枰虚g數(shù)據(jù)處理,所以效率更高。
五、N層模型中的數(shù)據(jù)處理
.Net Framework實(shí)現(xiàn)了許多新的技術(shù)以支持多層分布式處理,它提供了豐富的類庫(kù)、對(duì)象及方法使得在不同層間的數(shù)據(jù)傳輸更為簡(jiǎn)單。
(一)數(shù)據(jù)的提取
1.只用于顯示的數(shù)據(jù)
以一種固定格式為終端用戶顯示數(shù)據(jù)的話,沒有必要遠(yuǎn)程傳輸數(shù)據(jù)。我們沒有必要在線上將所有的數(shù)據(jù)傳送給客戶機(jī)--我們只能傳給它們客戶設(shè)備能接受的任何格式的最終顯示信息。因此"Reader"對(duì)象給我們提供了一種只讀的、僅向前的理想且性能最優(yōu)的技術(shù)。當(dāng)與能實(shí)現(xiàn)服務(wù)器端數(shù)據(jù)綁定的服務(wù)器控件一起使用時(shí),我們可以獲得一個(gè)顯示數(shù)據(jù)的高效方法。
2.需要遠(yuǎn)程傳輸?shù)臄?shù)據(jù)
如果我們需要遠(yuǎn)程傳輸數(shù)據(jù)的話則存在一個(gè)問題。這些快速而高效的"Reader"對(duì)象只在作為引用時(shí)才能被遠(yuǎn)程傳輸。將一個(gè)DataReader作為引用傳送給一個(gè)客戶機(jī)時(shí),DataReader仍還在服務(wù)器上,不過客戶機(jī)的應(yīng)用程序也可以使用它。在這種情況下,我們實(shí)際上并沒有遠(yuǎn)程傳輸數(shù)據(jù),而是使用了一個(gè)遠(yuǎn)程傳輸對(duì)象。在很多情況下都存在這種情況。因此應(yīng)該將數(shù)據(jù)寄存到一個(gè)能夠存儲(chǔ)數(shù)據(jù)的對(duì)象中,不需進(jìn)入數(shù)據(jù)存儲(chǔ)的額外行程就可以根據(jù)需要提取數(shù)據(jù),在ADO.NET中,這個(gè)對(duì)象就是DataSet對(duì)象或者DataTable對(duì)象。這兩個(gè)對(duì)象都有保持內(nèi)容的能力,并且可以在一個(gè)應(yīng)用程序的層之間進(jìn)行傳送。
(二)移動(dòng)數(shù)據(jù)處理
一般地,要獲得發(fā)送給客戶機(jī)的數(shù)據(jù),我們將利用客戶端腳本(JavaScript或 VBScript以及 WMLScript)、用Java或者一個(gè)特定平臺(tái)的語(yǔ)言書寫的客戶端組件,或者用諸如Visual Basic 6.0、C++、Delphi等語(yǔ)言書寫的客戶端可執(zhí)行程序等等。所有我們需要的功能都是.Net Framework的一部分。
(三)將更新回送給服務(wù)器
在許多情況下,如果我們的要求就是以一種盡可能快速和高效的方式獲得發(fā)送給客戶機(jī)的依據(jù),那么,上面的示例能很好地完成任務(wù)。然而,許多應(yīng)用程序要求客戶機(jī)將數(shù)據(jù)回送以更新數(shù)據(jù)存儲(chǔ)等操作時(shí),就需要尋找更合理的模式。
至少有三種方法用于向服務(wù)器端回送數(shù)據(jù)。一是回送Html表單和查詢字符串(實(shí)現(xiàn)方式與以前的ASP類似);另一是客戶端組件(例如IE5及以上版本的XMLHTTP組件);還有就是客戶端可執(zhí)行的Windows表單應(yīng)用程序和服務(wù)等。
因此,應(yīng)該有這樣一種情況:客戶機(jī)僅僅要求我們發(fā)送一些數(shù)據(jù),并且我們讓客戶機(jī)完成所有的數(shù)據(jù)處理。也就是說,客戶機(jī)充當(dāng)某種類型的服務(wù),它將應(yīng)用程序的數(shù)據(jù)作為自己的源數(shù)據(jù)來使用,然后在它的客戶機(jī)已經(jīng)處理數(shù)據(jù)后將更改提交回來。
一旦客戶端完成了數(shù)據(jù)更新,或者已經(jīng)收集了用戶輸入的新數(shù)據(jù),客戶機(jī)應(yīng)用程序就以一種合適的格式打包數(shù)據(jù),并將它提交給服務(wù)器進(jìn)行處理和存儲(chǔ)。
N層分布是程序開發(fā)的趨勢(shì),本文在層次的劃分上為您提供參考。
參考文獻(xiàn)
[1]Microsoft.NET Compact Framewor,技術(shù)內(nèi)幕,Stephen Wheelwright,清華大學(xué)出版社
[2]ASP.NET基礎(chǔ)教程,F(xiàn)ritz Ooion,清華大學(xué)出版社
[3]c#高級(jí)編程,Simon Robinson等,清華大學(xué)出版社