動(dòng)易SiteFactory快報(bào)--系統(tǒng)架構(gòu)
今天要和大家說(shuō)的是動(dòng)易SiteFactory 的系統(tǒng)架構(gòu)設(shè)計(jì)。
在軟件體系架構(gòu)設(shè)計(jì)中,分層式結(jié)構(gòu)是最常見(jiàn),也是最重要的一種結(jié)構(gòu)。微軟推薦的分層式結(jié)構(gòu)一般分為三層,從下至上分別為:數(shù)據(jù)訪問(wèn)層、業(yè)務(wù)邏輯層(又或成為領(lǐng)域?qū)樱?、表示層,如圖所示:
圖一:三層的分層式結(jié)構(gòu)
數(shù)據(jù)訪問(wèn)層:有時(shí)候也稱為是持久層,其功能主要是負(fù)責(zé)數(shù)據(jù)庫(kù)的訪問(wèn)。簡(jiǎn)單的說(shuō)法就是實(shí)現(xiàn)對(duì)數(shù)據(jù)表的Select,Insert,Update,Delete的操作。如果要加入ORM的元素,那么就會(huì)包括對(duì)象和數(shù)據(jù)表之間的mapping,以及對(duì)象實(shí)體的持久化。
業(yè)務(wù)邏輯層:是整個(gè)系統(tǒng)的核心,它與這個(gè)系統(tǒng)的業(yè)務(wù)(領(lǐng)域)有關(guān)。如果涉及到數(shù)據(jù)庫(kù)的訪問(wèn),則調(diào)用數(shù)據(jù)訪問(wèn)層。
表示層:是系統(tǒng)的UI部分,負(fù)責(zé)使用者與整個(gè)系統(tǒng)的交互。在這一層中,理想的狀態(tài)是不應(yīng)包括系統(tǒng)的業(yè)務(wù)邏輯。表示層中的邏輯代碼,僅與界面元素有關(guān)。在動(dòng)易CMS 2007中,是利用ASP.Net來(lái)設(shè)計(jì)的,因此包含了許多Web控件和相關(guān)邏輯。
分層式結(jié)構(gòu)究竟其優(yōu)勢(shì)何在?概括來(lái)說(shuō),分層式設(shè)計(jì)可以達(dá)至如下目的:分散關(guān)注、松散耦合、邏輯復(fù)用、標(biāo)準(zhǔn)定義。
1、分散關(guān)注:開(kāi)發(fā)人員可以只關(guān)注整個(gè)結(jié)構(gòu)中的其中某一層;
2、松散耦合:可以很容易的用新的實(shí)現(xiàn)來(lái)替換原有層次的實(shí)現(xiàn);可以降低層與層之間的依賴;
3、邏輯復(fù)用:可以有利于各層邏輯的復(fù)用。比如,可以使用同一個(gè)業(yè)務(wù)邏輯來(lái)實(shí)現(xiàn)不同的表現(xiàn)層,針對(duì)不同的客戶端顯示不同的界面。比如針對(duì)電腦和手機(jī)編寫(xiě)不同的界面,兩者共用相同的業(yè)務(wù)邏輯。
4、有利于標(biāo)準(zhǔn)化;
一個(gè)好的分層式結(jié)構(gòu),可以使得開(kāi)發(fā)人員的分工更加明確。一旦定義好各層次之間的接口,負(fù)責(zé)不同邏輯設(shè)計(jì)的開(kāi)發(fā)人員就可以分散關(guān)注,齊頭并進(jìn)。例如UI人員只需考慮用戶界面的體驗(yàn)與操作,領(lǐng)域的設(shè)計(jì)人員可以僅關(guān)注業(yè)務(wù)邏輯的設(shè)計(jì),而數(shù)據(jù)庫(kù)設(shè)計(jì)人員也不必為繁瑣的用戶交互而頭疼了。每個(gè)開(kāi)發(fā)人員的任務(wù)得到了確認(rèn),開(kāi)發(fā)進(jìn)度就可以迅速的提高。
松散耦合的好處是顯而易見(jiàn)的。如果一個(gè)系統(tǒng)沒(méi)有分層,那么各自的邏輯都緊緊糾纏在一起,彼此間相互依賴,誰(shuí)都是不可替換的。一旦發(fā)生改變,則牽一發(fā)而動(dòng)全身,對(duì)項(xiàng)目的影響極為嚴(yán)重。降低層與層間的依賴性,既可以良好地保證未來(lái)的可擴(kuò)展,在復(fù)用性上也是優(yōu)勢(shì)明顯。每個(gè)功能模塊一旦定義好統(tǒng)一的接口,就可以被各個(gè)模塊所調(diào)用,而不用為相同的功能進(jìn)行重復(fù)地開(kāi)發(fā)。
進(jìn)行好的分層式結(jié)構(gòu)設(shè)計(jì),標(biāo)準(zhǔn)也是必不可少的。只有在一定程度的標(biāo)準(zhǔn)化基礎(chǔ)上,這個(gè)系統(tǒng)才是可擴(kuò)展的,可替換的。而層與層之間的通信也必然保證了接口的標(biāo)準(zhǔn)化。
對(duì)于網(wǎng)站管理系統(tǒng)來(lái)說(shuō),采用分層式的設(shè)計(jì),可以適應(yīng)各種網(wǎng)站規(guī)模。網(wǎng)站的發(fā)展規(guī)模不斷發(fā)展變化,從一個(gè)個(gè)人網(wǎng)站發(fā)展成大型門(mén)戶網(wǎng)站,采用分層設(shè)計(jì)的系統(tǒng)自始至終都可以滿足功能需求和性能需求。在網(wǎng)站早期,使用分層設(shè)計(jì)的程序可能會(huì)有些浪費(fèi),并且?guī)?lái)性能上的一些損失,但隨著網(wǎng)站的不斷發(fā)展,分層設(shè)計(jì)的程序可以不做任何修改或者只需少量修改即可滿足大型網(wǎng)站的要求。而沒(méi)有分層設(shè)計(jì)的程序,初期可能速度會(huì)較快,但網(wǎng)站一大,就不得不換程序,或者重新設(shè)計(jì)系統(tǒng)架構(gòu)。
“金無(wú)足赤,人無(wú)完人”,分層式結(jié)構(gòu)也不可避免具有一些缺陷:
1、降低了系統(tǒng)的性能。這是不言而喻的。如果不采用分層式結(jié)構(gòu),很多業(yè)務(wù)可以直接造訪數(shù)據(jù)庫(kù),以此獲取相應(yīng)的數(shù)據(jù),如今卻必須通過(guò)中間層來(lái)完成。
2、有時(shí)會(huì)導(dǎo)致級(jí)聯(lián)的修改。這種修改尤其體現(xiàn)在自上而下的方向。如果在表示層中需要增加一個(gè)功能,為保證其設(shè)計(jì)符合分層式結(jié)構(gòu),可能需要在相應(yīng)的業(yè)務(wù)邏輯層和數(shù)據(jù)訪問(wèn)層中都增加相應(yīng)的代碼。這是對(duì)于程序員來(lái)說(shuō)的,普通用戶可以不用關(guān)心這一點(diǎn)。
在.Net中,標(biāo)準(zhǔn)的BS分層式結(jié)構(gòu)如下圖所示:
圖二:.Net中標(biāo)準(zhǔn)的BS分層式結(jié)構(gòu)
動(dòng)易CMS 2007遵循分層設(shè)計(jì)的思想,采用了三層設(shè)計(jì)的系統(tǒng)架構(gòu)。系統(tǒng)架構(gòu)圖如下所示:
圖三:動(dòng)易CMS 2007的體系架構(gòu)
熟悉企業(yè)應(yīng)用開(kāi)發(fā)的網(wǎng)友可能會(huì)發(fā)現(xiàn),動(dòng)易CMS 2007的系統(tǒng)架構(gòu)圖與Petshop極為類(lèi)似。是的,這是因?yàn)閯?dòng)易CMS 2007的系統(tǒng)架構(gòu)主要是參考微軟的企業(yè)級(jí)應(yīng)用范例——Petshop4.0而設(shè)計(jì)的。
下面主要講一下數(shù)據(jù)訪問(wèn)層(DAL)和業(yè)務(wù)邏輯層(BLL)的設(shè)計(jì)。
在數(shù)據(jù)訪問(wèn)層(DAL)中,采用DAL Interface抽象出數(shù)據(jù)訪問(wèn)邏輯,并以DAL Factory作為數(shù)據(jù)訪問(wèn)層對(duì)象的工廠模塊。對(duì)于DAL Interface而言,分別有支持MS-SQL的SQL Server DAL和支持Oracle的Oracle DAL具體實(shí)現(xiàn)。而Model模塊則包含了數(shù)據(jù)實(shí)體對(duì)象。其詳細(xì)的模塊結(jié)構(gòu)圖如下所示:
圖四:數(shù)據(jù)訪問(wèn)層的模塊結(jié)構(gòu)圖
在數(shù)據(jù)訪問(wèn)層中,完全采用了“面向接口編程”思想。抽象出來(lái)的IDAL模塊,脫離了與具體數(shù)據(jù)庫(kù)的依賴,從而使得整個(gè)數(shù)據(jù)訪問(wèn)層利于數(shù)據(jù)庫(kù)遷移。DALFactory模塊專(zhuān)門(mén)管理DAL對(duì)象的創(chuàng)建,便于業(yè)務(wù)邏輯層訪問(wèn)。SQLServerDAL和OracleDAL模塊均實(shí)現(xiàn)IDAL模塊的接口,其中包含的邏輯就是對(duì)數(shù)據(jù)庫(kù)的Select,Insert,Update和Delete操作。因?yàn)閿?shù)據(jù)庫(kù)類(lèi)型的不同,對(duì)數(shù)據(jù)庫(kù)的操作也有所不同,代碼也會(huì)因此有所區(qū)別。
此外,抽象出來(lái)的IDAL模塊,除了解除了向下的依賴之外,對(duì)于其上的業(yè)務(wù)邏輯層,同樣僅存在弱依賴關(guān)系,如下圖所示:
圖五:業(yè)務(wù)邏輯層的模塊結(jié)構(gòu)圖
圖五中BLL是業(yè)務(wù)邏輯層的核心模塊,它包含了整個(gè)系統(tǒng)的核心業(yè)務(wù)。在業(yè)務(wù)邏輯層中,不能直接訪問(wèn)數(shù)據(jù)庫(kù),而必須通過(guò)數(shù)據(jù)訪問(wèn)層。注意圖中對(duì)數(shù)據(jù)訪問(wèn)業(yè)務(wù)的調(diào)用,是通過(guò)接口模塊IDAL來(lái)完成的。既然與具體的數(shù)據(jù)訪問(wèn)邏輯無(wú)關(guān),則層與層之間的關(guān)系就是松散耦合的。如果此時(shí)需要修改數(shù)據(jù)訪問(wèn)層的具體實(shí)現(xiàn),只要不涉及到IDAL的接口定義,那么業(yè)務(wù)邏輯層就不會(huì)受到任何影響。畢竟,具體實(shí)現(xiàn)的SQLServerDAL和OracalDAL根本就與業(yè)務(wù)邏輯層沒(méi)有半點(diǎn)關(guān)系。
動(dòng)易SiteFactory 的業(yè)務(wù)層設(shè)計(jì)遵循這樣一個(gè)原則:在業(yè)務(wù)邏輯的處理中,如果存在業(yè)務(wù)操作的多樣化,或者是今后可能的變化,均應(yīng)利用抽象的原理,或者使用接口,或者使用抽象類(lèi),從而脫離對(duì)具體業(yè)務(wù)的依賴。
動(dòng)易SiteFactory 與Petshop的不同之處在于:Petshop只是一個(gè)簡(jiǎn)單的應(yīng)用范例,業(yè)務(wù)邏輯非常少,所以整個(gè)系統(tǒng)架構(gòu)中,將所有的業(yè)務(wù)邏輯存放于一個(gè)BLL的類(lèi)庫(kù)中;而整個(gè)動(dòng)易系統(tǒng)是由多個(gè)產(chǎn)品模塊的組合,所以實(shí)際上動(dòng)易CMS 2007的每個(gè)產(chǎn)品是遵循三層設(shè)計(jì),然后再由這些產(chǎn)品組合成整個(gè)系統(tǒng)。這一個(gè)問(wèn)題,我會(huì)在下一篇文章中講到。
用戶登錄
還沒(méi)有賬號(hào)?
立即注冊(cè)