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