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