TheBeerHouse 网站项目学习笔记(5)---架构设计
前述討論:????TheBeerHouse 網(wǎng)站項(xiàng)目學(xué)習(xí)筆記(1)----換膚技術(shù)??
??????????????????TheBeerHouse 網(wǎng)站項(xiàng)目學(xué)習(xí)筆記(2)----個(gè)性化管理?
??????????????????TheBeerHouse 網(wǎng)站項(xiàng)目學(xué)習(xí)筆記(3)----安全管理(上)?
??????????????????TheBeerHouse 網(wǎng)站項(xiàng)目學(xué)習(xí)筆記(4)----安全管理(下)???
摘要:TheBeerHouse整個(gè)網(wǎng)站是屬于CMS(Content Management System)架構(gòu)的系統(tǒng),即基于內(nèi)容的網(wǎng)站設(shè)計(jì),這是網(wǎng)站設(shè)計(jì)最普遍的一種架構(gòu).在此網(wǎng)站的設(shè)計(jì)中,為什么需要用到許多抽象基類,為什么需要各種看似讓人難以理解的屬性和成員變量,設(shè)計(jì)意圖是什么,這么設(shè)計(jì)有什么好處等等這類問(wèn)題,都是值得我們思考和探討的問(wèn)題.我們將從層次關(guān)系、類圖關(guān)系、設(shè)計(jì)意圖這幾個(gè)方面討論上述提出的問(wèn)題.
一. 層次關(guān)系
?????
如上圖,紅色虛線框內(nèi)的將是我們討論的內(nèi)容,這里面幾乎全部是類,他們共同構(gòu)成了我們新聞文章管理模塊的功能架構(gòu).首先我們看到,這些類全部放到了App_Code目錄中,在這個(gè)目錄中包含了邏輯層和數(shù)據(jù)層的各種類,這些類各具功能,和我們以前學(xué)習(xí)的中規(guī)中矩的三層架是有很多區(qū)別的,以前的三層結(jié)構(gòu)中分為實(shí)體層(Models)、數(shù)據(jù)層(ModelService)、邏輯層(ModelManager),這些層中只有簡(jiǎn)單的引用關(guān)系,基本不存在繼承或?qū)崿F(xiàn)接口的關(guān)系。那么當(dāng)需求增加后,這些層次關(guān)系是可以實(shí)現(xiàn)擴(kuò)充的,但總顯得有些單調(diào),因?yàn)橛羞@么樣一句話是說(shuō)的非常有道理的:在實(shí)際設(shè)計(jì)中,類的設(shè)計(jì)對(duì)于一些相似的功能類總該保持一個(gè)或多個(gè)基類,保持基類短小,讓它只包含子類所需的通用功能是個(gè)好的設(shè)計(jì)習(xí)慣, 即使最初在基類中不想放任何詳細(xì)的代碼,但以后如果需要一個(gè)通用屬性和方法, 那么在整個(gè)架構(gòu)中擁有一個(gè)基類也會(huì)很方便的.一般基類都設(shè)計(jì)成抽象類,所以我們?cè)诖私Y(jié)構(gòu)中看到的抽象類幾乎都是對(duì)下面具體子類通用功能的抽象。對(duì)于層次關(guān)系的討論我們就從基類開(kāi)始.
?二. 邏輯層的結(jié)構(gòu)
?????以下是邏輯層的類關(guān)系圖:?????
?
其實(shí)CategoryDetails類是數(shù)據(jù)層的一個(gè)實(shí)體類,但它和邏輯層的類之間有些依賴關(guān)系, 所以在這里也畫(huà)進(jìn)來(lái)了。這些類的關(guān)系有別與一般的三層結(jié)構(gòu)中的單純
的類關(guān)系,因?yàn)檫@里引入了抽象基類的概念.下面逐個(gè)介紹這些類的用途,以及為什么要使用如此的設(shè)計(jì)方法。
1. BizObject 這是邏輯層的最頂層的基類,從此類是斜體就看得出,它是一個(gè)抽象類.許多業(yè)務(wù)對(duì)象需要訪問(wèn)很多共享信息,比如當(dāng)前用戶名/IP地址以及當(dāng)前環(huán)境中Cache對(duì)象的引用.這些信息可以放在一個(gè)BizObject基類中,讓其他所有域?qū)ο髲乃^承.該基類還可以包含一些輔助方法,如通過(guò)替換特殊字符(例如'<'及'>')來(lái)對(duì)HTML輸入進(jìn)行編碼. 實(shí)際上,保持基類短小,讓它只包含子類所需的通用功能是個(gè)好的設(shè)計(jì)習(xí)慣, 即使最初在基類中不想放任何詳細(xì)的代碼,但以后如果需要一個(gè)通用屬性和方法,那么在整個(gè)架構(gòu)中擁有一個(gè)基類也會(huì)很方便的.
?????????
我們看到,此類的各種方法和屬性都是最基本的,都是新聞文章模塊中所有類都需要的一些公共屬性或字段以及方法,比如ConvertNullToEmptyString方法,其實(shí)這個(gè)方法代碼非常簡(jiǎn)單,如果輸入的字符串為Null,那么就轉(zhuǎn)換為 " " 的字符串,這個(gè)小的方法是所有下面子類或?qū)O子類都可能需要的一種方法,那么我們就將這個(gè)方法抽象出來(lái)作為通用基類的一個(gè)方法提供給子(孫)類來(lái)用。當(dāng)然,這只是一個(gè)小小的"伎倆",但體現(xiàn)了基類的作用,以及面向抽象的意義,面向抽象這個(gè)概念會(huì)在數(shù)據(jù)層的關(guān)系圖中得到詳細(xì)體現(xiàn),在下面再來(lái)介紹.其實(shí)這個(gè)類下面其它的方法和屬性跟剛才介紹的這個(gè)方法一樣,提供最一般的所有類的共享信息。當(dāng)然這么做的作用就是想"代碼復(fù)用".
2. BaseArticle 類是Article、Category和Comment的基類。它派生自BizObject類,并在此基礎(chǔ)上添加了一些文章特定的屬性。注意:這里是特定于文章的一些公共屬性,所以這個(gè)類的抽象性較BizObject類要弱一些,也就是更接近底層一些,更具體一些。
?
以上ID,AddDate,AddBy三個(gè)屬性對(duì)文章模塊中所有的業(yè)務(wù)類都是通用的,所以它可以被Comment,Article,Category這些類所繼承,這些就是基類存在的價(jià)值,也是我們?cè)谠O(shè)計(jì)的時(shí)候需要周全考慮的因素,因?yàn)檫@樣必然帶來(lái)代碼重用的效果,避免在以上三個(gè)類中都去添加ID,AddDate,AddBy這樣的三個(gè)屬性.
我們重點(diǎn)說(shuō)明Settings這個(gè)屬性:見(jiàn)如下代碼和注釋:
?/**////?<summary>
????????///?該屬性返回一個(gè)ArticlesElement配置類的實(shí)例
???????///?</summary>
????????protected?static?ArticlesElement?Settings???//?[$1]?,再追將追到下面重要說(shuō)明中的?[$2]和[$3]記號(hào)中
????????{
????????????[重要說(shuō)明]#region[重要說(shuō)明]
????????????//?如下語(yǔ)句中Globals.Settings?通過(guò)定義將返回TheBeerHouseSection類的實(shí)例,見(jiàn)[$2]
????????????//?這個(gè)實(shí)例是對(duì)web.config中配置節(jié)<theBeerHouse>的API引用
????????????//?那么在?Globals.Settings?下之所以有Articles這個(gè)屬性,可以參考
????????????//??TheBeerHouseSection類中Articles屬性的定義?[$3]
????????????#endregion
????????????get?{?return?Globals.Settings.Articles;?}???????
????????}
這個(gè)屬性將返回一個(gè)ArticlesElement配置類的實(shí)例,那么這個(gè)屬性到底有什么作用?我們知道,在整個(gè)網(wǎng)站的運(yùn)行過(guò)程中都會(huì)有各種參數(shù)設(shè)置的,這些設(shè)置都可以通過(guò)前述TheBeerHouse 網(wǎng)站項(xiàng)目學(xué)習(xí)筆記(2)----個(gè)性化管理?中介紹的自定義配置節(jié)進(jìn)行操作,那么我們就可以在網(wǎng)站運(yùn)行期間動(dòng)態(tài)的去讀這些配置信息,比如"是否啟用緩存","每頁(yè)顯示記錄數(shù)","RSS閱讀器的顯示數(shù)目"等這些設(shè)置都可以運(yùn)行時(shí)訪問(wèn)并修改,前句說(shuō)的"運(yùn)行時(shí)訪問(wèn)"操作大多集中在BaseArticle的三個(gè)子類上(Article,Category,Comment),因此,BaseArticle.Settings大多作在其子類中作為判斷下一步行為的依據(jù)而存在.比如在Article類中有如下的判斷語(yǔ)句:
?if (BaseArticle.Settings.EnableCaching && BizObject.Cache[key] != null)
??????????? {
??????????????? articles = (List<Article>)BizObject.Cache[key];
??????????? }
??????????? else ...............
以上的BaseArticle.Settings.EnableCaching就是在子類進(jìn)行文章獲取的時(shí)候先判讀是否網(wǎng)站的"啟用緩存" 開(kāi)關(guān)開(kāi)啟,如果開(kāi)啟那么就到緩存中直接去取數(shù)據(jù).
以上就是Setting屬性存在的價(jià)值,那么還需要強(qiáng)調(diào)的就是此三個(gè)子類都需要這些開(kāi)關(guān),所以我們就把Setting屬性做到了BaseArticle類中去,這么做當(dāng)然是符合代碼復(fù)用原則的.
以上是邏輯層類設(shè)計(jì)的意圖和相互關(guān)系,其實(shí)我們?cè)谡J(rèn)真分析這些類的關(guān)系后,還應(yīng)該多思考為什么作者要這么設(shè)計(jì),這么設(shè)計(jì)對(duì)于系統(tǒng)彈性會(huì)帶來(lái)哪些好處,這么設(shè)計(jì)我自己能否掌握,在今后的設(shè)計(jì)中如何借鑒或模仿。
那么下篇將繼續(xù)介紹數(shù)據(jù)層設(shè)計(jì)的意圖和類關(guān)系,并介紹些設(shè)計(jì)技巧...........
?
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/Rogerliu/archive/2009/03/07/1364823.html
總結(jié)
以上是生活随笔為你收集整理的TheBeerHouse 网站项目学习笔记(5)---架构设计的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: SQL Server 2005之PIVO
- 下一篇: C#托管代码与C++非托管代码互相调用二