1. 程式人生 > >ABP開發框架前後端開發系列---(1)框架的總體介紹

ABP開發框架前後端開發系列---(1)框架的總體介紹

ABP是ASP.NET Boilerplate的簡稱,ABP是一個開源且文件友好的應用程式框架。ABP不僅僅是一個框架,它還提供了一個最徍實踐的基於領域驅動設計(DDD)的體系結構模型。學習使用ABP框架也有一段時間了,一直想全面瞭解下這個框架的整個來龍去脈,並把想把它使用歷程整理成一個系列出來,不過一直沒有下筆來寫這篇文章的開篇,就是希望能夠深入瞭解,再深入瞭解一些,希望自己能夠理解透徹一些,不能誤人子弟,也不想和網上千篇一律的翻譯官網的內容,官網的英文介紹也已經很詳細了,於是我覺得還是以實際使用的過程進行一定的整理會更好。

初次瞭解ABP框架,對它還是非常驚豔的,它基本上是.NET 領域架構的集大成者,幾乎囊括了我們.NET領域排的上名的各種技術應用,而且它本身可以支援.net framework和.net core兩種技術流派,對它的介紹也是非常感興趣。

1)ABP框架的特點

我們來大概瞭解下ABP框架涉及到的內容。

  • 依賴注入,這個部分使用 Castle windsor (依賴注入容器)來實現依賴注入,這個也是我們經常使用IOC來處理的方式;
  • Repository倉儲模式,已實現了Entity Framework、NHibernate、MangoDB、記憶體資料庫等,倉儲模式可以快速實現對資料介面的呼叫;
  • 身份驗證與授權管理,可以使用宣告特性的方式對使用者是否登入,或者介面的許可權進行驗證,可以通過一個很細粒度的方式,對各個介面的呼叫許可權進行設定;
  • 資料有效性驗證,ABP自動對介面的輸入引數物件進行非空判斷,並且可以根據屬性的申請資訊對屬性的有效性進行校驗;
  • 審計日誌記錄,也就是記錄我們對每個介面的呼叫記錄,以及對記錄的建立、修改、刪除人員進行記錄等處理;
  • Unit Of Work工作單元模式,為應用層和倉儲層的方法自動實現資料庫事務,預設所有應用服務層的介面,都是以工作單元方式執行,即使它們呼叫了不同的儲存物件處理,都是處於一個事務的邏輯裡面;
  • 異常處理,ABP框架提供了一整套比較完善的流程處理操作,可以很方便的對異常進行進行記錄和傳遞;
  • 日誌記錄,我麼可以利用Log4Net進行常規的日誌記錄,方便我們跟蹤程式處理資訊和錯誤資訊;
  • 多語言/本地化支援,ABP框架對多語言的處理也是比較友好的,提供了對XML、JSON語言資訊的配置處理;
  • Auto Mapping自動對映,這個是ABP的很重要的物件隔離概念,通過使用AutoMaper來實現域物件和DTO物件的屬性對映,可以隔離兩者的邏輯關係,但是又能輕鬆實現屬性資訊的賦值;
  • 動態Web API層,利用這個動態處理,可以把Application Service 直接釋出為Web API層,而不需要在累贅的為每個業務物件手工建立一個Web API的控制器,非常方便;
  • 動態JavaScript的AJax代理處理,可以自動建立Javascript 的代理層來更方便使用Web Api,這個在Web層使用。

除了這些重要特性外,ABP框架還有很多一些特別的功能或者概念。

  • 多租戶支援(每個租戶的資料自動隔離,業務模組開發者不需要在儲存和查詢資料時寫相應程式碼;
  • 軟刪除支援(繼承相應的基類或實現相應介面,會自動實現軟刪除)
  • 系統設定存取管理(系統級、租戶級、使用者級,作用範圍自動管理)
  • EventBus實現領域事件(Domain Events)
  • 模組以及模組的依賴關係實現外掛化的模組處理等等

ABP框架主要還是基於領域驅動的理念來構建整個架構的,其中領域驅動包含的概念有 域物件Entities、倉儲物件Repositories、域服務介面層Domain Services、域事件Domain Events、應用服務介面Application Services、資料傳輸物件DTOs等。一般簡化來說,我們可以只需要保留域物件,標準倉儲物件(不用自定義倉儲介面)、應用服務介面和DTO物件即可,域服務層介面層和自定義的倉儲物件一般情況下可以省略,後面我會介紹這個內容,也就是利用這些物件及關係,快速構建一個易於使用的ABP框架分層。

ABP官方網站:http://www.aspnetboilerplate.com,從裡面可以檢視很詳細的案例和文件說明,可以根據需要下載不同型別的基礎框架。

ABP GitHub原始碼地址:https://github.com/aspnetboilerplate,可以下載整個基礎的框架內容,以及相關的樣板案例程式碼。

下面是一個比較直觀的ABP框架分層架構圖。

上圖只是一個大概的介紹,其實客戶端部分,還應該包括Winform客戶端、控制檯客戶端、WPF客戶端等內容,而瀏覽器的前端-Web前端,還可以包含使用Ant-Design(React)、IView(VUE)、Angular等不同的前端技術來承載介面呈現層。而底層的資料庫支援,還可以接入更多的,包括MS Sqlserver、Oracle、Mysql、PostgreSQL、SQLite等資料庫。

我們可以看到展現層、應用層、領域層、持久化層等幾個不同的分層,每個分層似乎都很好,但是可能需要落實到實處進行進一步的瞭解,由於目前.net core的技術應用逐漸走向主流,我們就以它的.net core方向進行介紹解讀。

 

2) Web API優先的架構

縱觀整個ABP框架,它的核心還是主要以 .NET 的後端技術為主線,也是著重筆墨的部分,在其展現層中,雖然Asp.NET MVC(包括.net Core部分)和Web API作為兩個部分,但它的動態釋出Web API,更為Web API優先的架構提供了很好的便利。

在當今流行的展現層中,越來越不依賴於後端的技術實現,而側重於Web API標準化的對接,基於JSON資料的互動處理。不管是以Ant-Design(React)、IView(VUE)、Angular等技術應用的Web前端,我們可以看到這些架構很容易實現對Web API的標準介面對接,在我較早提供的Winform混合框架裡面,也是以Web API優先的策略進行雲端應用的部署。如下圖是我在部落格《Web API應用架構設計分析(1)》、《Web API應用架構設計分析(2)》、《Web API介面設計經驗總結》、《Winform混合式開發框架訪問Web API介面的處理》、《Web API應用架構在Winform混合框架中的應用(3)--Winform介面呼叫WebAPI的過程分解》等文章中的闡述。

作為ABP框架的核心、Web API動態釋出,為其展現層提供了非常方便的途徑,使得我們可以在利用其強大的後端架構的基礎上,整合了很多.NET的很多技術應用,如前面介紹的很多ABP框架的特性。

前面介紹了基於Web API優先應用的特點,可以為我們產品線的快速擴充套件提供了很好的技術支撐,而ABP框架是一個比較強大、健壯,而且是集眾多.NET優秀技術應用的集大成者,雖然整合使用ABP框架會比較一般的框架需要花費多一些時間,不過在構建比較大型,又需要強大的後臺的需求下,這種應用場景是非常不錯的,也是一個很好的投資。

 

3)ABP 框架的專案結構

ABP框架,包含了兩個部分,一個基礎的ABP框架實現(地址https://github.com/aspnetboilerplate/aspnetboilerplate),這個是我們所說的ABP框架的核心實現;

一個是基於這個基礎上擴充套件應用的ABP框架,它整合了框架核心部分,並提供了一些基礎處理模組,如人員、角色、許可權、會話、身份驗證、多租戶、日誌記錄等等內容,我們一般指的ABP框架應用就是這個基礎上擴充套件自己的業務專案。這個部分,我們可以根據官網上進行一定的選項配置,然後下載使用。

下載.net core 專案後,其中後端部分的專案檢視如下所示。

我們從這個專案裡面可以看到,它主要是分為下面幾個專案分層。

Application應用層:應用層提供一些應用服務(Application Services)方法供展現層呼叫。一個應用服務方法接收一個DTO(資料傳輸物件)作為輸入引數,使用這個輸入引數執行特定的領域層操作,並根據需要可返回另一個DTO。

Core領域核心層,領域層就是業務層,是一個專案的核心,所有業務規則都應該在領域層實現。這個專案裡面,除了定義所需的領域實體類外,其實可以定義我們自己的自定義的倉儲物件(類似DAL/IDAL),以及定義自己的業務邏輯層(類似BLL/IBLL),以及基於AutoMapper對映規則等內容。

EntityFrameworkCore 實體框架核心層,這個專案不需要修改太多內容,只需要在DbContext裡面加入對應領域物件的倉儲物件即可。

Migrator資料遷移層,這個是一個輔助建立的控制檯程式專案,如果基於DB First,我們可以利用它來建立我們專案的初始化資料庫。

Web.Core Web核心層,基於Web或者Web API的核心層,提供了對身份登陸驗證的基礎處理,沒有其他內容。

Web.Core.Host Web API的宿主層,也是動態釋出Web API的核心內容,另外在Web API裡面整合了Swagger,使得我們可以方便對Web API的介面進行除錯。

Tests 單元測試層,這個提供了一些應用層物件的模擬測試,其中測試的資料庫使用的是Entity Framework 的記憶體資料庫,不影響實際資料庫內容。

 

以上是ABP框架的總體情況,我們到現在還沒有正式深入介紹其中的各個部分,以及如果對這些內容進行優化處理,主要就是介紹一個整體性的ABP框架特性,以及ABP框架側重的Web API方向,後續我繼續對它進行深入的介紹和專案改造,以便適應我們實際的ABP專案開發。