摘要:討論 Microsoft .NET 的應用程序設計和所需的更改:檢驗從使用 Microsoft Windows DNA 構建 N 層應用程序中學到的結構知識,以及如何將這些知識應用到使用 Microsoft .NET 框架構建的應用程序,并且為使用 XML Web services 的應用程序提供體系結構方面的建議。
簡介如今,N 層應用程序已經成為構建企業軟件的標準。對于大多數人來說,N 層應用程序就是被分成多個獨立的邏輯部分的應用程序。最常見的選擇是分為三個部分:表示、業務邏輯和數據,當然還可能存在其他的劃分方法。N 層應用程序最初是為了解決與傳統的客戶端/服務器應用程序相關的問題而出現的,但是,隨著 Web 時代的到來,這一體系結構開始成為新開發項目的主流。
Microsoft Windows® DNA 技術已成為 N 層應用程序的非常成功的基礎。Microsoft .NET 框架也為構建 N 層應用程序提供了堅實的平臺。然而,.NET 所帶來的變化使結構設計人員應當重新考慮他們在 Windows DNA 領域中所學的有關設計 N 層應用程序的某些知識。更重要的是,對內置于 .NET 框架的 XML Web services 的基本支持允許開發人員構建突破傳統 N 層方法的新應用程序。要了解如何更好地構建 .NET 應用程序的體系結構,您需要了解這一新領域中發生了哪些變化,以及如何充分利用這些變化。
本文將對這些問題進行討論。首先回顧一下在使用 Windows DNA 構建 N 層應用程序中學到的關鍵體系結構知識。然后,再按同一順序將這些知識應用到使用 .NET 框架構建應用程序的過程中,從而對它們進行檢驗。最后一部分對使用 XML Web services 的應用程序的體系結構提供了一些建議。
Windows DNA 環境將應用程序分解成多個邏輯部分是很有用的。將一個大軟件分成幾個小的部分會更利于軟件的構建、重復利用和修改,對適應不同的技術或不同的業務組織也很有幫助。同時,還有一些綜合因素需要考慮。雖然模塊化和重復使用性很有效,但它們可能會導致應用程序不能象使用其他方法那樣安全、易管理和快速。本節將回顧一些從使用 Windows DNA 技術構建 N 層應用程序的普遍經驗中所獲得的基本體系結構知識。
編寫業務邏輯Windows DNA 應用程序通常使用以下三種實現方式中的一種或多種方式來實現其業務邏輯:
一般來講,在 ASP 頁中編寫過多的業務邏輯并不是一個好辦法。因為必須使用簡單的語言,例如 Microsoft Visual Basic® Script (VBScript),而且每次執行時都要解釋代碼,這會對性能造成影響。而且 ASP 頁中的代碼不好維護,主要是因為業務邏輯通常與創建用戶界面的表示代碼混合在一起。
鑒于這種情況,建議在編寫中間層業務邏輯時,將業務邏輯當作 COM 對象來實現。這種方法比編寫純粹的 ASP 應用程序要稍微復雜一點,但是可以使用全功能語言來生成編譯好的可執行文件,因此其結果要快得多。將業務邏輯包裝在 COM 對象中還可以將此代碼與包含在 ASP 頁中的表示代碼完全分隔開來,從而使應用程序更易于維護。
從 COM 到 COM+,其體系結構相差無幾。但是,正如許多 Windows DNA 體系結構設計人員所了解的,除非真正需要,否則不應使用 COM+ 提供的核心服務,如事務、實時 (JIT) 激活、基于角色的安全性和線程服務等。使用其他開發平臺提供的 COM+ 或類似服務自然會導致應用程序速度更慢、更復雜。只有在以下情況下使用 COM+ 才有意義:
編寫業務邏輯的第三種方式是,創建一些作為存儲過程在數據庫管理系統 (DBMS) 中運行的代碼。盡管使用存儲過程的主要原因是將數據庫架構的詳細信息與業務邏輯分隔開以簡化代碼的管理和提高安全性,但代碼與數據如此接近也有助于優化性能。那些必須獨立于 DBMS 的應用程序(例如由獨立的軟件供應商創建的應用程序)通常要避免使用這種方法,因為它會將應用程序鎖定到某個特定的數據庫系統中。存儲過程的編寫和調試可能會比 COM 對象的編寫和調試難,而且此方法會減少重復使用代碼的機會,這是因為 COM 對象通常比存儲過程更易于重復使用。但是大多數自定義應用程序仍然連接到最初創建它們的 DBMS 上,因此使用存儲過程的性能優勢還是很大的。鑒于這種情況,那些必須盡可能運行良好的 Windows DNA 應用程序通常對部分或全部的業務邏輯都使用存儲過程。
Windows DNA 既支持用 Visual Basic 等語言編寫的本地 Windows 客戶端,也支持瀏覽器客戶端。瀏覽器客戶端的局限性較大,尤其同時將 Microsoft Internet Explorer 和 Netscape 作為瀏覽器時。因此,應用程序通常同時擁有瀏覽器客戶端和本地 Windows 客戶端。瀏覽器客戶端提供的界面很有限,但用它可以方便地訪問 Internet,而 Windows 客戶端能提供全功能的界面。使用可下載的 Microsoft ActiveX® 控件可以創建更復雜的瀏覽器界面,但必須確保瀏覽器是 Internet Explorer,并且用戶愿意信任應用程序的創建者。
管理瀏覽器應用程序中的狀態ASP 應用程序可以使用幾個不同的機制來維護服務器上客戶端請求之間的信息。但是 Windows DNA 中有一條嚴格的規則,如果應用程序在兩臺或多臺機器之間平衡負載,則絕對不能使用 ASP Session 對象存儲每個客戶端的狀態。ASP 的 Session 對象被鎖定在一臺機器上,因此不能用于負載平衡的應用程序。
ASP Session 對象和 ASP Application 對象還有另一個限制。使用它們中的任何一個來存儲 ADO 記錄集都會大大降低可伸縮性,因為它限制了應用程序開發多線程的能力。因此,在這兩個對象的任何一個中存儲記錄集都不是好辦法。
分布式通信在 Windows DNA 中,選擇運行在不同機器上的組件的通信方式非常簡單:DCOM 可以說是唯一的選擇。單純從體系結構上來看,DCOM 是 COM 的簡單擴展。但實際上,DCOM 還有許多其他含義,其中包括:
可以將使用 ADO 構建的數據訪問體系結構分為兩類:輕型和重型。輕型 ADO 客戶端盡可能簡短地保持數據庫連接,并使用存儲過程寫入數據庫。輕型客戶端使用以下三種方法之一檢索數據:
重型客戶端則會較長時間地保持數據庫連接。這類應用程序依賴于開放式連接,以及那些連接所允許的有狀態的服務器端游標,以:
輕型應用程序最具伸縮性,因為它們最有效地使用了數據庫連接這一稀有資源。相比之下,重型應用程序必須保持長期有效的數據庫連接,因為這是有狀態的服務器端游標所要求的。這就大大地限制了應用程序的可伸縮性,尤其不適用于 Internet 服務器應用程序。盡管使用 ADO 開發重型應用程序可能更簡單,但通常這并不是最佳選擇。
ADO 也不是特別適用于處理 XML 文檔等分層數據。ADO 完成此項工作的功能用法復雜,且不易理解。同樣,ADO 僅為訪問 SQL Server 2000 的 XML 功能提供有限支持,因此,Windows DNA 應用程序通常都避免使用 ADO 處理分層數據。
對于所有 N 層應用程序而言,將數據從中間層有效地移動到客戶端都是一個關鍵的環節。當使用 DCOM 與 Windows 客戶端通信時,Windows DNA 應用程序可以使用 ADO 斷開連接的記錄集。當確保瀏覽器為 Internet Explorer 時,此選項也可用于瀏覽器客戶端。而將數據發送到任意瀏覽器則比較困難。一種方法是顯式地將數據轉換為 XML,然后將數據和所有必要的腳本代碼發送到瀏覽器。
.NET 環境.NET 支持傳統的 N 層應用程序、Web services 應用程序以及將二者的元素結合在一起的應用程序。本節首先介紹 .NET 如何影響 N 層應用程序,然后介紹構建 Web services 應用程序過程中的幾個主要的體系結構問題。
將 N 層應用程序與 .NET 綁定在一起上一節中介紹的某些問題同樣適用于 Windows DNA 應用程序和使用 .NET 框架構建的應用程序。例如,只有當滿足前面所列的一個或多個條件時,才能使用 COM+(在 .NET 框架中稱為企業服務)。同樣,將業務邏輯構建為存儲過程在很多 N 層應用程序中都可以獲得更好的性能。
同時,.NET 框架中到處都是新技術和現有技術的新版本。這些增強功能為 N 層應用程序的優化體系結構帶來了多種變化。本節將按照前面介紹的分類,介紹 .NET 框架是如何改變體系結構設計人員在創建 N 層應用程序時所做的決定的。
編寫業務邏輯與在 Windows DNA 中創建 N 層業務邏輯的三種可選方法(ASP 頁、COM 組件和存儲過程)不同,.NET 框架只提供了兩種方法:程序集和存儲過程。對于瀏覽器應用程序,可以使用 Microsoft ASP.NET .aspx 頁來創建程序集。與 ASP 不同,在這種情況下完全使用 ASP.NET 編寫業務邏輯通常是一個比較好的方法。
其中一個原因就是 ASP.NET 的內含代碼選項。在傳統的 ASP 頁中,以一種可維護的方式混合業務代碼和表示代碼并不是一件容易的事,而 .aspx 頁使用內含代碼能夠完全將這兩種代碼分開。Windows DNA 應用程序可能需要同時使用 ASP 頁和 COM 對象才能實現可維護性,而使用 .NET 框架構建的應用程序則只需使用 ASP.NET。此外,.aspx 頁中包含的業務邏輯可以用任何基于 .NET 的語言編寫,而不僅限于傳統 ASP 頁所支持的簡單的腳本語言。而且,ASP.NET 是編譯頁面而不是解釋頁面,因此 ASP.NET 應用程序速度可以非???。雖然使用 Windows DNA 構建的應用程序可以使用 ASP 頁和 COM 對象來達到足夠高的性能,但 .NET 只需使用 ASP.NET 便可構建具有同樣優良性能的應用程序。最后,業務邏輯使用 ASP.NET 緩存來減少對包含常用數據的數據庫的訪問,這樣可以大大提高性能。
但是,需要指出的是,對于包含在 .aspx 頁中的代碼,即使是使用內含代碼,其重復使用也比標準的程序集困難。例如,從 Windows 窗體客戶端訪問 .aspx 頁中的代碼會遇到很多問題。
構建客戶端使用 .NET 框架可減少對 Windows 客戶端的需求,通常只需要一個瀏覽器客戶端即可。其中一個原因在于,ASP.NET Web 控件允許構建和/或購買可重復使用的瀏覽器圖形用戶界面 (GUI) 元素,從而能夠更方便地構建更有用的瀏覽器客戶端。而且可以將基于 .NET 框架的組件下載到 Internet Explorer 客戶端,然后使用部分信任來運行這些組件(而不使用 ActiveX 控件所要求的全是全非信任模式),這有助于構建更好的用戶界面。
管理瀏覽器應用程序中的狀態由于 ASP Session 對象被綁定到一臺機器上,因此它并未發揮出應有的作用,而使用 .NET 框架就避免了這種限制。與 ASP 不同,ASP.NET Session 對象可以被兩臺或多臺機器共享,從而可以使用 Session 對象來維護負載平衡的 Web 服務器領域中的狀態,使其更加有用。而且,由于 Session 對象的內容可以選擇存儲在 SQL Server 數據庫中,這種機制可用于出現故障時必須一直保持每個客戶端的狀態的應用程序中。
影響 ASP.NET 應用程序體系結構的另一個重要更改在于,數據集可以存儲在 Session 和 Application 對象中而無需包含線程,這一點與 ASP 不同。也就是說,在 Windows DNA 中嚴格規定的不能將記錄集存儲在這些對象中的規則不適用于 .NET 框架中的數據集。這就使得查詢結果的存儲更加簡單也更加自然。
分布式通信與 Windows DNA 相比,.NET 框架為應用程序的分布式部件之間的通信提供了更多選擇,包括:
選項越多,意味著體系結構的選擇也越多,這也意味著做選擇時有更多需要考慮的因素。使用 .NET 框架創建分布式應用程序時要了解的體系結構問題包括:
ADO 能夠方便地構建重型客戶端,但客戶端的伸縮性較差,ADO.NET 與 ADO 不同,它更適用于構建輕型客戶端。ADO.NET 客戶端使用僅向前的只讀游標讀取數據。它不支持有狀態的服務器端游標,因此其編程模式鼓勵短時間的連接。直接讀取和處理數據的客戶端可以使用 ADO.NET 的 DataReader 對象,它不為返回的數據提供緩存?;蛘?,可以將數據讀入 DataSet 對象中,將其作為從 SQL 查詢和其他源中返回的數據的緩存。但是,與 ADO 記錄集不同,數據集不能顯式地維護與數據庫的開放連接。
如前面所述,ADO 生成的重型方法還存在一些其他問題。這些問題可以在 ADO.NET 中解決,如下所示:
ADO.NET 中影響體系結構選擇的另一項更改是其對處理分層數據(特別是 XML 文檔)的支持增強了。將 ADO.NET 數據集轉換成 XML 非常簡單,就象訪問 SQL Server 2000 的 XML 功能一樣。因此,在 Windows DNA 中可能被強制裝入關系模型中的分層數據現在可以以其原始形式提供訪問。
將數據傳遞到客戶端
將數據有效地傳遞到客戶端對于在 .NET 框架上構建的 N 層應用程序和使用 Windows DNA 構建的應用程序同樣重要。一項重要的更改在于,ADO.NET 數據集可自動序列化成 XML,從而使得各層之間的數據傳遞更加簡單。雖然在 Windows DNA 中也可以使用這種方法,但 .NET 使通過 XML 的信息交換變得更加簡單、直接。
XML Web Services 體系結構在構建分布式應用程序的過程中,可以通過多種方法來使用 XML Web services 的 SOAP、Web Services 說明語言 (WSDL) 以及其他技術。例如:
不管如何使用,XML Web services 都會帶來許多新的體系結構問題。XML Web services 與 N 層應用程序通常使用的更為傳統的中間件技術之間的最主要的差別或許在于,XML Web services 提供的是“松散耦合”。遺憾的是,這個詞對于不同的用戶有著不同的含義。在本文中,它是指具有以下特點的通信應用程序:
這些基本特點為使用 XML Web services 的應用程序提供了很多體系結構方面的原則。雖然有些問題可能會在以后的工作中得到解決,如 Microsoft 的 Global XML Web Services Architecture (GXA) specifications(英文),但是目前,創建有效的 XML Web services 應用程序的用戶必須要了解這些問題。其中包括:
體系結構是關鍵。為應用程序(尤其是分布于多個系統的應用程序)選擇正確的結構是至關重要的。如果選擇了錯誤的體系結構,不管開發人員多么優秀,通常都無法在實現過程中修復。錯誤的決定會導致性能降低、安全性降低以及應用程序需要更新時可用的選項較少。
Windows DNA 為 N 層應用程序奠定了一個堅實的基礎,Windows 開發人員可以根據他們從 DNA 領域所學到的知識來構建應用程序,把其中的大部分應用到新的 .NET 環境中。不過,了解本文所建議的更改將有助于創建更快、更安全、功能更強的應用程序。對于 N 層應用程序以及采用 Web services 新技術的應用程序來說,.NET 可提供的功能很多。
原文轉自:http://www.anti-gravitydesign.com