新聞中心
做軟件架構(gòu)設(shè)計(jì)的時(shí)候,三層式體系結(jié)構(gòu)是一個(gè)很常套用的分層模式。三層式體系結(jié)構(gòu)中會(huì)將系統(tǒng)切割成為:PL(Presentation Layer)、BLL(Business Logic Layer)、DAL(Data Access Layer)。在這其中BLL是整個(gè)系統(tǒng)的系統(tǒng)核心,而DAL則是數(shù)據(jù)對(duì)象進(jìn)出系統(tǒng)的系統(tǒng)邊界。本篇文章討論實(shí)作系統(tǒng)時(shí),系統(tǒng)核心與系統(tǒng)邊界之間的架構(gòu)如何設(shè)計(jì),才能提高內(nèi)聚、減少耦合。

我們先假設(shè)系統(tǒng)設(shè)計(jì)時(shí),將BLL、DAL各自獨(dú)立為一個(gè)DLL。而BLL里有Control對(duì)象操作Object對(duì)象、ObjectReposository對(duì)象用來(lái)提供功能給PL使用、DAL里則有ObjectReposository對(duì)象來(lái)封裝Object對(duì)象進(jìn)出系統(tǒng)邊界的職責(zé)。這樣的系統(tǒng)架構(gòu)下,會(huì)發(fā)現(xiàn)Object對(duì)象,同時(shí)被BLL及DAL所使用。這個(gè)共享的Object對(duì)象,在系統(tǒng)里該如何存在是一件很有趣的問題。
思考Object對(duì)象在系統(tǒng)里該如何存在這件事,以最直覺方式來(lái)思考的話,會(huì)認(rèn)為BLL層是「使用」Object對(duì)象,而DAL只是讓Object對(duì)象「通過」。那Object對(duì)象歸類進(jìn)BLL里,應(yīng)該是可以接受的設(shè)計(jì)。
實(shí)作上卻會(huì)發(fā)現(xiàn),BLL里的Control對(duì)象要操作ObjectReposository對(duì)象,所以BLL層相依DAL層。而將Object對(duì)象歸類進(jìn)BLL里,ObjectReposository對(duì)象要操作Object對(duì)象,又必須DAL相依BLL。這兩個(gè)相依,造成了設(shè)計(jì)上的循環(huán)相依。
Object對(duì)象放進(jìn)BLL會(huì)有循環(huán)相依的問題,那將Object對(duì)象放進(jìn)DAL也是會(huì)有同樣的問題發(fā)生。那干脆就將Object對(duì)象封裝成一個(gè)獨(dú)立DLL,這樣的設(shè)計(jì)避免BLL、DAL之間的循環(huán)相依,也提供了彈性讓DAL、Object對(duì)象的組合可以重用。
實(shí)作上這個(gè)設(shè)計(jì)可以正常工作,但這是架構(gòu)在「Object對(duì)象為貧血對(duì)象」這個(gè)前提上。假設(shè)Object對(duì)象不是貧血對(duì)象實(shí)作了部分系統(tǒng)功能,而BLL實(shí)作其他系統(tǒng)功能,當(dāng)Object對(duì)象要重用BLL的系統(tǒng)功能時(shí),就會(huì)造成循環(huán)相依的問題。而Object對(duì)象如果實(shí)作了所有系統(tǒng)功能,那BLL的存在就顯得多余。
在網(wǎng)絡(luò)上或設(shè)計(jì)架構(gòu)書籍里可以看到,將BLL要使用的邊界對(duì)象設(shè)計(jì)為接口封裝成一個(gè)獨(dú)立DLL,并且BLL相依于這個(gè)接口、DAL實(shí)作這個(gè)界面。這樣的設(shè)計(jì)避免BLL、DAL之間的循環(huán)相依,也提供了彈性讓BLL可以抽換DAL實(shí)作。
實(shí)作上這個(gè)設(shè)計(jì)可以正常工作,但還是架構(gòu)在「Object對(duì)象為貧血對(duì)象」這個(gè)前提上,無(wú)法解決這個(gè)前提造成的種種問題。
問題的解決方案其實(shí)沒那么困難,回到最直覺的設(shè)計(jì),將Object對(duì)象歸類進(jìn)BLL里,并且在BLL與DAL之間套用IoC,反轉(zhuǎn)Control對(duì)象與ObjectReposository對(duì)象之間的相依性。這樣的設(shè)計(jì)避免BLL、DAL之間的循環(huán)相依、提供了彈性讓BLL可以抽換DAL實(shí)作,并且加強(qiáng)了BLL的內(nèi)聚、減少BLL的耦合、……。。
但是這樣的設(shè)計(jì)在遇到重用Object對(duì)象的情景,例如:使用WCF來(lái)傳遞Object對(duì)象時(shí),則必須要去考慮不同上下文(Context)關(guān)系來(lái)做設(shè)計(jì)。而「上下文關(guān)系」是另外一個(gè)有趣的議題,并且包含很多技術(shù)內(nèi)容。限于篇幅的關(guān)系,這部分內(nèi)容另外開主題再來(lái)討論。
本篇文章討論實(shí)作系統(tǒng)時(shí),系統(tǒng)核心與系統(tǒng)邊界之間的架構(gòu)如何設(shè)計(jì),并介紹提高內(nèi)聚、減少耦合的解決方案。這些基礎(chǔ)面向?qū)ο笤O(shè)計(jì)概念,閱讀起來(lái)會(huì)比較無(wú)趣,并且實(shí)作時(shí)也會(huì)遇到很多的困難。但仍希望開發(fā)人員能夠花點(diǎn)時(shí)間投資,畢竟現(xiàn)在很多新技術(shù),都是靠這些面向?qū)ο蟮脑O(shè)計(jì)去堆砌出來(lái)的。
原文鏈接:http://www.cnblogs.com/clark159/archive/2012/07/30/2616080.html
分享題目:系統(tǒng)邊界設(shè)計(jì)
標(biāo)題來(lái)源:http://www.5511xx.com/article/djsdoso.html


咨詢
建站咨詢
