ABP理論學習之N層架構
自從寫這個系列博客之后,發現很多園友還是希望有個直接運行的demo,其實在github上就有官方的demo,我直接把這demo的鏈接放到這里吧,另外,我分析,這些找不到demo的同學,很可能是不怎么用github,可能的原因就是英文不好。所以還是希望程序員多看看英文文檔,一開始看得很慢不要緊,時間久了,速度絕對能上去。因為都是技術性的文章,沒有特別難的語法,能讓大家退而卻步的最多是些生詞,這個就要靠大家積累常見的詞匯了,一些生僻詞的話查一下意思,理解了那句話就可以過了。
跟ABP相關的所有源碼,包括zero,demo,都在這個目錄下了,大家可以一個個點擊看一下。下面做一稍微解釋。
本篇目錄
介紹
對應用代碼基進行分層可以幫助降低復雜度和提高代碼復用性,這已經成為廣為接受的技巧。為了實現分層的架構,ABP遵循以下*DDD(領域驅動模型)的原則。在DDD中,有四個基礎層:
- 表現層:用戶訪問的接口,使用應用層實現用戶交互。
- 應用層:表現層和領域層之間的媒介。負責組織業務對象,以執行特定的應用任務。
- 領域層:包括業務對象和原則。這是應用的核心。
- 基礎設施層:為支持更高層提供了廣泛的技術能力。基礎設施層的一個例子是倉儲,它可以通過ORM框架和數據庫進行交互。
也可能會加入額外必要的層。以下就是一個例子:
- 分布式服務層:將應用的功能暴露給遠程客戶端。可以提供這個層的工具包括Asp.Net Web API和WCF。
這些都是以領域為中心的架構的通用層次。基於實現的話,可能還會稍有不同。
ABP架構
層次和結構的概覽如下圖所示:
實際解決方案中的項目分層如下:
一層可以為一個或多個程序集。對於第三方依賴創建不止一個程序集可能會特別好(比如NHibernate)。
領域層
領域層是所有的業務規則實現的地方。
實體代表了業務領域的數據和操作。在實踐中,它們一般會映射到數據庫的表中。
倉儲式跟集合很像的對象,使用倉儲可以檢索數據源(數據庫)上的實體,並將實體持久化到數據源上。領域層只是定義了倉儲,但是並沒有實現它們,它們是在基礎設施層實現的。
領域事件定義了領域特定的事件,也包括觸發和處理這些事件。領域服務借助實體運行,並實現了不屬於單個實體的業務規則。
工作單元是一種管理實體的設計模式,這些實體受業務邏輯影響,並將狀態持久化到數據存儲中。
領域層應該盡可能地獨立於第三方的庫。
應用層
應用層包含了展現層使用的應用服務。應用服務方法接收一個DTO(數據傳輸對象)作為輸入參數,使用這個輸入對象執行一些特定的領域層操作,然后,如果需要的話,可能返回另一個DTO。一般而言,應用服務方法不接收或者返回一個實體對象,這樣做的好處就是可以允許展現層可以從領域層中將實體抽象出來,而不受實體的約束。一個應用服務方法一般被看作是一個工作單元。用戶輸入驗證也是在這一層實現的。ABP提供了一個基礎設施,因此可以很容易地實現驗證。建議使用一個將實體映射為DTO的工具,比如AutoMapper,TinyMapper等。要學習AutoMapper的使用,請查看我的AutoMapper系列博客吧!
基礎設施層
雖然領域層定義了倉儲接口,但是基礎設施層使用諸如NHibernate或者EntityFramework的ORM工具實現了那些倉儲接口。ABP提供了使用這兩種ORM框架的基類。基礎設施層用於抽象來自其他層的第三方類庫,數據庫遷移(Database Migration)也可以用在這一層。
Web和展現層
Web層使用ASP.NET MVC和Web API實現的。這里可以使用兩種不同的方式來實現:單頁面應用和多頁面應用。
在單頁面應用中(SPA),所有的資源都會一次性加載到客戶端(或者只加載核心資源,懶加載其他資源),所有的后續和服務器的交互都是通過Ajax調用。Html代碼是使用從服務端接收到的數據在客戶端生成的。整個頁面不會刷新,視圖只是在必要時換入換出。有許多的Javascript SPA框架,比如AngularJs,DurandalJs,BackboneJs和EmberJs。ABP可以使用它們中的任何一個,但是提供了使用 AngularJs和DurandalJs的樣例。
在多頁面(經典)應用中(MPA),客戶端向服務端發送請求,服務端代碼(ASP.NET MVC 控制器)從數據庫中獲取數據,然后Razor視圖引擎生成html 代碼。這些編譯后的頁面發回給客戶端顯示。每個新的頁面都會導致完整頁面的刷新。
SPA和MPA涉及了完全不同的架構。對於后台管理系統來說,SPA是最好的候選者,另一方面,博客更適合MPA模型,因為博客渴望被搜索引擎抓取數據。雖然有很多工具可以使SPA對於搜索引擎可見,但是目前的一般做法就是使用MPA。
SignalR是發送服務端到客戶端的推送通知的最好工具,也可以給用戶提供一個豐富而且實時的體驗。
在客戶端還有很多javascript庫和框架。jQuery是這個領域最流行的,並伴有成千上萬的插件。也有很多很容易就能使用Html和CSS的框架或工具。比如,Twitter Bootstrap是非常流行的HTML/CSS框架。
ABP提供了使用應用服務層自動創建Web API層的基礎設施,使用Javascript可以輕松地調用Web API(看文檔)。而且,還提供了管理管理應用菜單,本地化以及語言切換的基礎設施,還包含了統一的Javascript API來簡化顯示系統的信息和通知。
ABP自動處理服務端的異常,並給客戶端返回一個合適的響應。
其他
ABP通過Castle Windsor使用並支持依賴注入,也使用了Log4Net來記錄服務端的日志,然而,通過使用Castle的日志設備無需改變代碼就可以切換到其他的日志庫。
總結
ABP平衡了一些最好的框架或者類庫,除此之外,ABP自己的類和系統也提供了一個很好的用於N層架構Web應用構建的基礎設施,也提供了很輕松地創建分層的解決方案的模板,用作應用的起點。