ABP(現代ASP.NET樣板開發框架)系列之三、ABP分層架構

點這裏進入ABP系列文章總目錄html

 

基於DDD的現代ASP.NET開發框架--ABP系列之三、ABP分層架構
前端

 

ABP是「ASP.NET Boilerplate Project (ASP.NET樣板項目)」的簡稱。git

ABP的官方網站http://www.aspnetboilerplate.comgithub

ABP在Github上的開源項目https://github.com/aspnetboilerplate數據庫

 


 

前言

爲了減小複雜性和提升代碼的可重用性,採用分層架構是一種被普遍接受的技術。
爲了實現分層的體系結構,ABP遵循DDD(領域驅動設計)的原則,將分爲四個層次:設計模式

  • 展示層(Presentation):提供一個用戶界面,實現用戶交互操做。
  • 應用層(Application):進行展示層與領域層之間的協調,協調業務對象來執行特定的應用程序的任務。它不包含業務邏輯。
  • 領域層(Domain):包括業務對象和業務規則,這是應用程序的核心層。
  • 基礎設施層(Infrastructure):提供通用技術來支持更高的層。例如基礎設施層的倉儲(Repository)可經過ORM來實現數據庫交互。

根據實際須要,可能會有額外添加的層。例如:瀏覽器

  • 分佈式服務層(Distributed Service):用於公開應用程序接口供遠程客戶端調用。好比經過ASP.NET Web API和WCF來實現。

這些都是常見的以領域爲中心的分層體系結構。不一樣的項目在實現上可能會有細微的差異。前端框架


ABP的體系結構

一個簡單的解決方案,大體包含5個項目:
服務器

每一層能夠用一個或多個程序集來實現。架構

 

領域層(Domain)

領域層就是業務層,是一個項目的核心,全部業務規則都應該在領域層實現。

實體(Entity)
  實體表明業務領域的數據和操做,在實踐中,經過用來映射成數據庫表。

倉儲(Repository
  倉儲用來操做數據庫進行數據存取。倉儲接口在領域層定義,而倉儲的實現類應該寫在基礎設施層。

領域服務(Domain service)
  當處理的業務規則跨越兩個(及以上)實體時,應該寫在領域服務方法裏面。

領域事件(Domain Event)
  在領域層某些特定狀況發生時能夠觸發領域事件,而且在相應地方捕獲並處理它們。

工做單元(Unit of Work)
  工做單元是一種設計模式,用於維護一個由已經被修改(如增長、刪除和更新等)的業務對象組成的列表。它負責協調這些業務對象的持久化工做及併發問題。


應用層(Application)

應用層提供一些應用服務(Application Services)方法供展示層調用。一個應用服務方法接收一個DTO(數據傳輸對象)做爲輸入參數,使用這個輸入參數執行特定的領域層操做,並根據須要可返回另外一個DTO。在展示層到領域層之間,不該該接收或返回實體(Entity)對象,應該進行DTO映射。一個應用服務方法一般被認爲是一個工做單元(Unit of Work)。用戶輸入參數的驗證工做也應該在應用層實現。ABP提供了一個基礎架構讓咱們很容易地實現輸入參數有效性驗證。建議使用一種像AutoMapper這樣的工具來進行實體與DTO之間的映射。

 

基礎設施層(Infrastructure)

當在領域層中爲定義了倉儲接口,應該在基礎設施層中實現這些接口。可使用ORM工具,例如EntityFramework或NHibernate。ABP的基類已經提供了對這兩種ORM工具的支持。數據庫遷移也被用於這一層。

 

WEB與展示層(Web & Presentation)

Web層使用ASP.NET MVC和Web API來實現。可分別用於多頁面應用程序(MPA)和單頁面應用程序(SPA)。
在SPA中,全部資源被一次加載到客戶端瀏覽器中(或者先只加載核心資源,其餘資源懶加載),而後經過AJAX調用服務端WebApi接口獲取數據,再根據數據生成HTML代碼。不會整個頁面刷新。如今已經有不少SPA的JS框架,例如: AngularJs、 DurandalJs、BackboneJs、EmberJs。 ABP可使用任何相似的前端框架,可是ABP提供了一些幫助類,讓咱們更方便地使用AngularJs和DurandalJs。

在經典的多頁面應用(MPA)中,客戶端向服務器端發出請求,服務器端代碼(ASP.NET MVC控制器)從數據庫得到數據,而且使用Razor視圖生成HTML。這些被生成後的HTML頁面被髮送回客戶端顯示。每顯示一個新的頁面都會整頁刷新。

SPA和MPA涉及到徹底不一樣的體系結構,也有不一樣的應用場景。一個管理後臺適合用SPA,博客就更適合用MPA,由於它更利於被搜索引擎抓取。

SignalR是一種從服務器到客戶端發送推送通知的完美工具。它能給用戶提供豐富的實時的體驗。

已經有不少客戶端的Javascript框架或庫,JQuery是其中最流行的,而且它有成千上萬免費的插件。使用Bootstrap可讓咱們更輕鬆地完成寫Html和CSS的工做。

ABP也實現了根據Web API接口自動建立 Javascript的代碼函數,來簡化JS對Web Api的調用。還有把服務器端的菜單、語言、設置等生成到JS端。(可是在我本身的項目中,我是把這些自動生成功能關閉的,由於必要性不是很大,而這些又會比較影響性能)。

ABP會自動處理服務器端返回的異常,並以友好的界面提示用戶。

 

其它

ABP使用Castle Windsor爲整個程序框架提供依賴注入的功能。使用Log4Net日誌記錄組件,提供給其餘各層調用以進行日誌記錄。

 


 

但願更多國內的架構師能關注到ABP這個項目,也許這其中有能幫助到您的地方,也許有您的參與,這個項目能夠發展得更好。

歡迎加QQ羣:

ABP架構設計交流羣:134710707 ABP架構設計交流羣      ABP架構設計交流2羣: 579765441ABP架構設計交流羣2

 

點這裏進入ABP系列文章總目錄

相關文章
相關標籤/搜索