1. 程式人生 > >ABP總體介紹 - 層架構體系(二)

ABP總體介紹 - 層架構體系(二)

html wcf log 領域驅動 cat spa inf 前端框架 發送郵件

1.2 ABP總體介紹 - 層架構體系

1.2.1 前言

為了減少復雜性和提高代碼的可重用性,采用分層架構是一種被廣泛接受的技術。為了實現分層的體系結構,ABP遵循DDD(領域驅動設計)的原則,將工程分為四個層:

  • 展現層(Presentation):向用戶提供一個接口(UI),使用應用層來和用戶(UI)進行交互。

  • 應用層(Application):應用層是表現層和領域層能夠實現交互的中間者,協調業務對象去執行特定的應用任務

  • 領域層(Domain):包括業務對象和業務規則,這是應用程序的核心層。

  • 基礎設施層(Infrastructure):提供通用技術來支持更高的層。例如基礎設施層的倉儲(Repository)可通過ORM來實現數據庫交互,或者提供發送郵件的支持。

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

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

這些都是常見的以領域為中心的分層體系結構。不同的項目在實現上可能會有細微的差別。

1.2.2 ABP的體系結構

層次結構概覽如下圖所示:
技術分享圖片

一個簡單的解決方案,大致包含5個項目:

技術分享圖片

一個層可以被實現為一個或者多個程序集。對於大項目的第三方依賴創建多個應用程序集這是一個好的選擇(例如:這裏的EntityFramework)。還有,在有限界上下文中,每個上下文都有它自己的分層。

1.2.3 領域層

領域層是實現所有業務規則的地方。

實體(Entity)
實體代表業務領域的數據和操作,在實踐中,通常用來映射成數據庫表。

倉儲(Repository)
倉儲是像集合一樣的對象,用來在數據源(數據庫)上檢索和存儲實體。在領域層定義倉儲,但是不實現它們。它們在基礎設施層被實現。

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

領域事件(Domain Event)
領域事件被用來定義特定於領域的事件,並且觸發使用它們。領域服務與實體(以及其他領域對象)一起實現了不屬於單個實體的業務規則。

工作單元(Unit of Work)


工作單元是一種設計模式被用來管理數據庫連接和事務,以及跟蹤實體更改,並將這些更改保存到數據存儲中。它被定義在領域層中,但是在基礎設施層實現它們。

1.2.4 應用層

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

1.2.5 基礎設施層

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

1.2.6 WEB與展現層

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會自動處理服務器端返回的異常,並以友好的界面提示用戶。

1.2.7 其它

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

ABP總體介紹 - 層架構體系(二)