ABP 框架提供了一個穩定的架構用于構建企業級軟件解決方案,[它遵循了.NET](http://xn--ykq892ae9cst8d.NET) 和 [ASP.NET](http://ASP.NET) Core 平臺之上的最佳實踐。它內置了基礎架構、生產級別的模塊、主題、工具、指南和文檔,并盡可能地自動化開發細節和解法我們的重復性工作。
在接下來的幾個小節中,我將從架構層面介紹 ABP是如何完成所有這些工作。
## 1 ABP 架構
ABP 是一個特殊的架構,換句話說,它是一個有個性化的框架。先解釋一下什么是沒有個性的框架,什么是有個性的框架。
正如我在*搭建架構*部分所述,為搭建解決方案的基礎設施需要大量決策工作;比如系統架構、開發模型、技術、模式、工具和庫。
沒有個性的框架,例如 [ASP.NET](http://ASP.NET) Core,這些決定大多由您決定。例如,您可以通過將 UI 層與數據訪問層分離來創建分層解決方案,或者您可以通過直接從 UI 頁面/視圖訪問數據庫來創建單層解決方案。您可以使用任何庫,只要它與 [ASP.NET](http://ASP.NET) Core 兼容,并且您可以應用任何架構模式。無個性使 [ASP.NET](http://ASP.NET) Core 在不同的場景中變得靈活和可用。但是,所有的這些都需要我們自己去做決策。
我并不是說 [ASP.NET](http://ASP.NET) Core 完全沒有自己的個性想法。假定您正在構建基于 HTTP 規范的 Web 應用程序或 API。它清楚地定義了應該如何開發 UI 和 API 層。它還提供了一些低級的基礎設施組件,例如依賴項注入、緩存和日志記錄。但是,它并沒有說明您的業務代碼是應該要如何組建,應該使用哪些架構模式。
換句話說,ABP 框架是一個有個性傾向的框架。它相信軟件開發方法本質上可以更好,因此可以引導開發人員在解決方案中使用更佳的架構、模式、工具和庫。
盡管 ABP 框架足夠靈活,可以使用不同的工具和庫來改變您的架構決策,但當您遵循它的實踐原則時,您將獲得最大的價值。請別擔心,因為它為通用架構提供了良好的、行業認可的解決方案。他的架構規則將節省您的時間,提高您的生產力,并使您專注于您的業務代碼而不是基礎設施問題。
在接下來,我將介紹 ABP 所支持的四種基本架構。
### 1.1 領域驅動設計
ABP 的主要目標是根據整潔代碼原則提供一個模型來構建易維護的解決方案。它提供了一個基于DDD 模式和實踐的分層架構 。它提供了一個分層的啟動模板、基礎架構以及架構應用指南。
由于 ABP 是一個軟件框架,它專注于 DDD 的技術實現。本書的第 3 部分,實現領域驅動設計,解釋了使用 ABP 框架構建基于 DDD 的最佳實踐。
### 1.2 模塊化
在軟件開發中,模塊化是一種拆分系統成獨立模塊的技術。最終目標是降低復雜性,提高可重用性,使不同的團隊能夠在不相互影響的情況下能并行處理不同的功能集。
ABP構建模塊化有兩個主要挑戰:
* 第一個挑戰是模塊隔離。[盡管ASP.NET](http://xn--ASP-9x0fp99k.NET) Core 有一些特性(例如 Razor 組件庫)來支持模塊化。但是,它仍然非常有限,因為它是一個底層通用的框架,并且僅對 UI 和 API 部分支持。另一方面,ABP 框架提供了一個一致的模型和基礎設施來構建完全隔離的、可重用的應用模塊及數據庫、領域、應用和 UI 層。
* 第二個挑戰是模塊之間如何通信,使之成為一個統一的應用程序。ABP 為模塊化系統提供常見的模型,例如在模塊之間共享數據庫,在模塊之間通過事件或 API 進行通信,以及模塊安裝。
ABP 提供了許多可在任何應用程序中使用的預構建模塊。包括身份驗證模塊,它提供用戶、角色和權限管理,同時也提供登錄和注冊頁面。他們基本上都是可重用和自定義的。此外,ABP 提供了模塊啟動模板,幫助您構建可重用的應用程序。這方面的一個例子可以在\[*第 15 章*\]使用模塊化中詳細介紹。
模塊化非常適合管理復雜的大型單體系統。但是,ABP 也可以幫助您創建微服務解決方案。
### 1.3 微服務
微服務和分布式架構是構建可擴展系統的公認方法。它允許不同的團隊開發不同的服務并獨立地對服務進行單獨部署和擴展。
但是,構建微服務系統在團隊開發、部署、微服務間通信、數據一致性、監控等方面存在一些重要挑戰。
微服務系統是一種將不同的學科、方法、技術和工具結合在一起來解決獨特問題的解決方案。每個微服務系統都有其要求和限制。每個團隊都有一定程度的專業知識、知識和技能。
ABP 框架從一開始就被設計為**與微服務兼容**。它在具有事務支持的微服務之間提供了一個用于異步通信的分布式事件總線。它還提供 C# 客戶端代理來輕松調用遠程服務的 REST API。
所有預構建的 ABP 應用模塊都經過設計,以便您可以將它們轉換為微服務。ABP 也提供了詳細指南來解釋如何創建微服務兼容模塊。這樣,您可以從模塊化單體開始,然后將其轉換為微服務解決方案。
ABP 團隊準備了一個使用 ABP 框架構建的開源微服務參考方案。它演示了如何使用 API 網關、微服務間通信、分布式事件、分布式緩存、多個數據庫提供程序和多個 UI 應用程序。它還包括在容器上運行解決方案的 Kubernetes 和 Helm 配置。詳情[參閱](https://github.com/abpframework/eShopOnAbp)。
### 1.4 SaaS/多租戶
**軟件即服務**(**SaaS**) 是一種廣泛使用的架構模式。以下是多租戶系統的典型特征:
* 在租戶之間共享硬件和軟件資源。
* 每個租戶都有用戶、角色和權限。
* 在租戶之間隔離數據庫、緩存和其他資源。
* 可以啟用/禁用每個租戶的應用功能。
* 可以為每個租戶自定義應用配置。
ABP 框架涵蓋了所有這些要求甚至更多。它可以幫助您優雅地構建多租戶系統,而您幾乎感受不到多租戶的存在。
我們會在\[*第 16 章*\]實現多租戶,介紹如何使用 ABP 框架進行多租戶應用開發。
到目前為止,我已經介紹了四種 ABP 基本架構模式。此外,ABP 還提供了啟動模板來輕松創建新的解決方案。
## 2 啟動模板
使用 [ASP.NET](http://ASP.NET) Core 自帶的模板創建新解決方案時,只能獲得單個項目,沒有分層和依賴關系。您通常會花費大量時間來設置解決方案架構,包括安裝工具和做配置基本。
ABP 框架提供了一個架構完善、分層清晰、預配置和生產就緒的啟動解決方案模板。以下截圖顯示了當您運行 ABP 框架創建的啟動模板時的初始 UI:

下面談談這個啟動模板:
* 解決方案已經做好邏輯分層。
* 一些預構建模塊,例如**Account**和**Identity**模塊。已經實現了基本的*登錄*、*注冊*、*用戶和角色管理*以及其他一些標準功能。
* 預先配置好的 **單元測試**和**集成測試**項目。
* 一些管理數據庫遷移以及使用 HTTP API實用工具。
ABP的啟動模板帶有**UI框架**和**數據庫提供**者的多個選項。你可以從**Angular**、**Blazor**或**MVC**(**Razor Pages**) 選擇一個作為 UI框架,或者使用**Entity Framework Core**或**MongoDB**作為數據庫提供者。
## 3 ABP 基礎設施
ABP 基于您已經了熟悉的工具和庫。它沒有引入新的**對象關系映射器**(**ORM**),而是使用**Entity Framework Core**。同樣,它使用 Serilog、AutoMapper、IdentityServer 和 Bootstrap,而不是自己創建類似的功能。它提供了一個解決方案集成了這些工具,并實現了常見的業務應用需求。
ABP 框架按照約定**簡化**了異常處理、驗證、授權、緩存、審計日志和數據庫事務管理,并允許您在需要時進行精細控制。
ABP 與 IdentityServer 很好地集成,基于 cookie 和令牌的身份驗證以及單點登錄。它還提供了一個詳細的、基于權限的授權系統來幫助您控制應用的權限。
同時也提供了后臺作業、BLOB 存儲、文本模板、審計日志和本地化等常見組件。
在 UI 部分,ABP 提供了完整的 UI 主題系統,幫助您開發無主題的模塊化應用,并輕松為應用程序安裝主題。它還在 UI 方面提供了大量功能和幫助程序,以消除重復代碼。
## 4 社區
當您在公司中搭建解決方案架構時,除了開發人員沒有人會去研究它。然而,ABP 擁有一個龐大而活躍的社區。他們使用相同的架構和基礎設施,應用類似的最佳實踐,并以類似的方式開發他們的應用程序。當您遇到基礎架構問題或想要獲得解決業務問題的想法或建議時,這具有很大的優勢。由于 ABP 開發人員正在應用相同或相似的模式,因此在另一個解決方案中也更容易理解他人的代碼。
ABP 框架自 2016 年以來一直存在并不斷發展。截至 2021 年底,它在 GitHub 上擁有 7,000 多顆星、220 多位貢獻者、22,000 多個提交、5,700 個已關閉問題,以及在 NuGet 上超過 4,000,000 次下載,超過 110 多個專業和次要版本。我的意思是,它是一個成熟的、被接受的、值得信賴的開源項目。
來自ABP 核心團隊和社區的貢獻者,有著不斷持續輸出的文章,視頻教程可供大家學習:[ABP社區網站](https://community.abp.io):

# 概括
在本章中,我們介紹了構建業務解決方案的問題,并解釋了 ABP 如何為這些常見問題提供解決方案。ABP 還通過提供預構建架構解決方案和實現該架構所需的基礎設施來提高開發人員的生產力。
在下一章中,您將學習如何使用 ABP 的**命令行界面**(**CLI**) 工具創建新的解決方案并在您的開發環境中運行它。
- 前言
- 第一部分
- 第1章 現代軟件開發和 ABP 框架
- 企業級 Web 開發的挑戰
- ABP框架的能力清單
- 第2章 ABP框架入門
- 安裝 ABP CLI
- 創建新解決方案
- 運行解決方案
- 探索預構建模塊
- 第3章 逐步開發開發ABP應用
- 創建解決方案
- 定義領域對象
- EFCore和數據庫映射
- 定義應用服務
- 測試產品
- 產品列表
- 創建產品
- 編輯產品
- 刪除產品
- 第4章 探索 EventHub解決方案
- 應用介紹
- 架構探索
- 方案運行
- 第二部分
- 第5章 探索ABP基礎架構
- 了解模塊化
- 使用依賴注入系統
- 配置應用程序
- 實現選項模式
- 日志系統
- 第6章 數據訪問基礎架構
- 定義實體
- 定義倉儲庫
- EF Core集成
- 了解 UoW
- 第7章 探索橫切關注點
- 認證授權
- 用戶驗證
- 異常處理
- 第8章 體驗 ABP 的功能和服務
- 獲取當前用戶
- 使用數據過濾
- 控制審計日志
- 緩存數據
- 本地化用戶界面
- 第三部分
- 第9章 理解領域驅動設計
- 介紹 DDD
- 構建基于 DDD 的 解決方案
- 處理多個應用程序
- 了解執行流程
- DDD的通用原則
- 第10章 領域層 Domain
- 領域事件案例分析
- 聚合和實體的設計原則和實踐
- 實現領域服務
- 落地存儲庫
- 構建規約(Specification)
- 領域事件
- 第11章 應用層 Application
- 落地應用服務
- 設計 DTO
- 理解各層的職責
- 第四部分
- 第12章 MVC/Razor 頁面
- 主題系統
- 綁定和壓縮
- 導航菜單
- Bootstrap標簽助手
- 創建表單并驗證
- 使用模態窗口
- 使用JS API
- 調用HTTP API
- 第13章 Blazor WebAssembly UI
- 什么是Blazor
- ABP Blazor UI
- 驗證用戶身份
- 理解主題系統
- 使用菜單
- 使用基本服務
- 使用UI服務
- 消費HTTP API
- 使用全局腳本和樣式
- 第14章 HTTP API 和實時服務
- 構建HTTP API
- 使用HTTP API
- 使用SignalR
- 第五部分
- 第15章 落地模塊化
- 理解模塊化
- 構建支付模塊
- 安裝模塊
- 第16章 實現多租戶
- 理解多租戶
- 多租戶基礎設施
- 使用功能系統
- 何時使用多租戶
- 第17章 構建自動化測試
- 了解ABP測試基礎設施
- 構建單元測試
- 構建集成測試