一個四層應用體系架構 [cboframework c# beta 1
系統
2098 0
有關
dotnet
下的應用體系構架的話題,我們可以明確的從某一點開始,但是可能沒有結束的那一點,永遠沒有
:)
一大批原來
com+
的程序員開始在
com
和
dotnet
之間走鋼絲,一方面忙于將重點和應用向
dotnet
構架上轉移,一方面還要照顧著原來的
com
。最后這些程序員將在經歷了某一個學習曲線之后坦然的面對兩者,掌握了如何分別和兩者交互和周旋的技巧。但是問題可能才剛剛開始,因為他們很快開始問這樣的問題:今后的程序該怎么寫,程序的構架是怎樣的?
太多的程序構架模型,讓他們開始有些眼花繚亂了,新的概念和技術似乎太多了,掌握了這些概念之后會發現一種無從下手的感覺,你不知那一種方式是相對最好的。paul d. sheriff (pdsa, inc.)在4月底的msdn上發表了
designing a .net application
( updrading to microsoft.net )的文章,里面有總結了目前dotnet下常用的幾種程序構架和各自的特點。事實上,當你使用ado.net, asp.net, com+, web services , xml, remoting, dcom/soap/http就可以象他那樣組合出不下20種的三層或多層構架形式。另外還可以加上msmq 和sqlxml。
一部分程序員已經開始有些怨言,相對于j2ee的嚴格規范,dotnet下的架構似乎過分開放了。相信這種狀態還會持續一段時間,microsoft也需要經歷一個優化和整合的過程才能做出富有成效和建設性的指導和建議。這之前的時間里,對于應用架構的選擇問題可能會落到isv和開發人員身上。
經過一段時間的發展過程中,有一些原則已經被總結出來,并且被越來越多的應用起來,比如:
1.
使用統一和強健的dal(data access layout)和存儲過程,使得數據服務層更加接口化和高效能。應用面向對象分析和設計將business層組件和對象化,從而順利使用設計模式,提高可重用性。
3.
設計時充分考慮面向web services的接口和功能。
4.
使用dotnet接口和屬性將三層更加細化和分層以提供更高層次的抽象。
5.
層與層之間的接口越來越“松散耦合”,穩定性和靈活性明顯獲得提高。
6.
使用com+的比重開始降低,com+被精確的應用分布式、多數據庫和核心中間件上。
7.
商務邏輯更加細化,一定比重的商業邏輯的實現從商業邏輯層移到表現層,由多層共同完成。
8.
web server開始慢慢成為離客戶端最近的業務邏輯代理和資源、權限的控制器。
webform和winform提供了豐富的ui,使得表現層有更多精力處理用戶會話、登錄、權限等問題。
10.
xml和schema被更多的應用在設計中,往往成為系統中多層之間聯系和通訊的“膠水”和介質。
下面要說的這個四層應用體系架構源于《designing solutions with com+ technologies》中的11章的一個實例。wade baron將原來的三層結構進行了調整,其一是實現客戶端的對象化訪問,其二是將業務邏輯層分為事務服務層和對象服務層,對象服務位于表現層(客戶端),事務服務在原來的業務邏輯層,位于服務器端。具體的見下圖:
cboframework框架體現了上面的2,4,7,10的一些特征,特別是引入了面向對象的設計和分析,結束了返回ado記錄集的business對象的混亂表現,使得表現層有更多的精力處理自己的邏輯。另外一方面由于實現了抽象和對象化,使得設計時可以應用目前已知的多種設計模式。
cboframework中也使用了collection的技術和概念,但它不同于早先mike mcclure (microsoft)和leo romano(sierra system group inc)描述的
ecc(engine-collection-class) framework
。cbo也可以應用object factory或其他的設計模式,但作為核心設計上cbo沒有強調設計模式,而是體現了接口編程和面向對象分析技術。在表現上cbo沒有ecc那么直觀和有針對性,我個人認為cbo更加強大和先進,負載上比ecc的collection傳遞要小許多,并且由于是接口設計更容易擴展,比如可以使用dotnet新的remoting、soap協議作為分布協議,當然兩者并不沖突,理解ecc對于理解cbo有很大幫助,因為兩者有些是相同的。
由于篇幅有限,我將不翻譯原文的設計思路和描述,
強烈建議你從原著和書中獲得更詳細的設計思想和內部流程
。本文將提供原來沒有的類圖表示(這是從visual studio.net中反向工程我的代碼獲得的)我將整個框架按dotnet的方式以c#重新編寫(原來作者提供一個visual basic版本的project),表現層,我沒有使用作者的,而是重新寫了一個簡單的進行測試,(我更希望未來直接使用作者的例子,因為他的客戶端實現更好和更完整)。另外,shippers對象(三個類)我沒有完成,因為理解框架后一些對象的實現基本上是copy/paste的過程。例子使用的數據庫是sql server和ms access數據庫中著名的northwind的樣本數據庫,未進行刪改。
系統需要的環境:visual studio.net en rtm+, sql server 2000 sp2.
細節和實現:
整個框架定義了四個接口、一個對象持久性的實現和一個object collection的實現。
接口:ipersistobjectstream和iobjectstream是客戶端接口
接口:ipersisttransstream 和 itransstream 是服務器端接口。
cbocollection是一個object collection實現,被用于實現對象集合。
所有對于每個對象的集合比如:customers、orders等等都必須一個集合對象,由于dotnet不提供generic porgramming特性(templates),那么為每一個現實對象實現一個type-safe的集合對象將是痛苦的。這里我使用了
chris sells
提供的collectiongen工具,產生了一個object類型的通用cbo object collection。(生產速度很快,而且很方便但不是type-safe的collection,這意味著可能會有一定類型轉換的性能消耗,太多集合對象,一個一個產生似乎太….)
cstream 實現iobjectstream和itransstream ,這個類實現了將客戶端的對象保持到數據庫中(對象持久性)。目前這個類借助xml,使得客戶端將通過透露的接口把對象序列化到這個xml流中,并且可以進行讀取;同時服務器端事務對象可以從這個對象透露的接口中讀取數據。
事務服務層(transaction services)的對象
所有的事務層對象都必須實現ipersisttransstream,這個接口被流對象調用,用來將數據寫到數據庫中。下面是一個customers事務對象的實現
對象服務層( object services)的對象
對象服務層的對象:對象和對象集合都必須實現ipersisobjectstream接口。這個接口主要由流對象使用,用來從xml流中加載對象和將對象狀態保存到xml數據流中。
使用
cboframework
的好處可以在客戶端得到最好的體現,現在表現層用戶可以將自己的精力完全放在表現層的界面和業務邏輯流程的處理上,而不用理會記錄集字段的次序和類型轉換。表現層的用戶可以更加容易的使用這些和現實中類似的對象來進行編程和操作,達到和業務流程的對應。
lret = customer.updateaddress( addre)
m_ocustomer.address = addre ;
m_ocustomer.save() ;
刪除
lret = customer.deletecustomer ( cuid)
m_ocustomer.delete() ;
新增
lret = customer.addnew ( a1,a2,a3…)
m_ocustomer = new ccustomer() ;
m_ocustomer.campany = a1 ;
m_ocustomer.contact = a2 ;
………
m_ocustomer..save() ;
當然這里簡化了一些,典型dna架構下的一些記錄集的檢索、計算、求和等等被簡化了,事實上這些邏輯經常亂七八糟的排在表現層的代碼中。cboframework最終達到我們的目的:提高可重用性,代碼更加簡潔和易于維護。
未來:
這是cboframework的第一個版本,其目標是理解其架構并將其在dotnet平臺上實現。必須承認這個版本是非常原始和簡陋的,仍有許多沒有完成。它僅僅闡明了整個框架,展示了對這個框架的一個實現和應用,我想未來會對cboframework做更多的補充和調整,比如下一個版本會增加下面一些特性:
1.
目前還不能算是真正的分布式,所有的事務服務層對象還沒有從servicedcomponent繼承(我注釋了這可能不是最終方案),那么對象服務層和事務服務層的通訊(非本機)還必須通過dcom,也就是需要在com+進行打包部署。下一個版本會實現在對象服務層和事務服務層實現remoting協議通訊,當然最好同時兼容dcom。
2.
實現一個通用的dal或dao (data access object),統一事務服務層對于數據庫的訪問方式,使之兼容mssql,xml、oledb和sqlxml。
3.
完善應用的實例,并且通過使用一個創建類型的設計模式,使原來的作者的vb實例(com用戶)可以透明的使用新的組件。另外增加asp.net的實例。
4.
將框架中使用的xml函數進行整理,統一成一個xmlhelp類便于重用。
5.
基于上述cbocollection的描述,將這個類的實現從cboframework的命名空間中移出來,放到次一級的命名空間,便于以后使用的框架的用戶決定實現自己的object collection類。
總結:
以上我們基本討論一個和原來windows dna相關的體系結構的改進版本:一個四層的結構。這種結構調整了原來常見的三層結構的分類并引進了面向對象的設計和分析。另外cboframework使用接口和流的概念借助xml實現了一個對象持久化(對象到關系數據庫的映射)。整個cboframework充分使用了接口定義,所以非常利于擴充和改進。個人認為理解這個框架本身比使用這個框架意義更加重大;雖然它還十分單薄,但我想這將一個不錯的開始。
一個四層應用體系架構 [cboframework c# beta 1 ]
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元