## 整體架構圖
下面是解決方案整體架構圖:

如圖所示,有六個應用程序和一個數據庫,下面提供了更多的信息:
* **身份驗證服務器**:此服務用于登錄、注冊和管理用戶帳戶。它基于 ABP 的標準**Account**模塊,該模塊基于該`IdentityServer`庫。它是**單點登錄**(**SSO**) 服務,這意味著如果您登錄/退出到其中一個應用程序,那么您將登錄/退出到所有應用程序。那是一個ASP.NET Core Razor Pages 應用程序,它直接連接到數據庫。
* **主站**:這是最終用戶用來注冊和創建活動的平臺 ([www.openeventhub.com)](http://www.openeventhub.com/)它是一個使用**Main HTTP API**作為后端的Razor Pages應用程序。
* **管理員后臺**:此應用允許管理員管理組織、事件和系統。它使用**Admin HTTP API**進行所有操作,這是一個**Blazor WebAssembly**應用。
* **主站 HTTP API**:主網使用調用的 HTTP API接口。
* **Admin HTTP API**:管理員后臺調用的 HTTP API。
* **后臺服務**:運行系統后臺進程服務和后臺作業的**控制臺程序。**
* **數據庫**:這是一個關系型 **PostgreSQL**數據庫,用于存儲系統中的所有數據。
由于是分布式系統,所以使用**Redis**作為分布式緩存服務器。
我們先從身份驗證流程開始。
## 認證流程
如前所述,**Authentication Server**是一個 SSO 服務,用于對用戶和客戶端進行身份驗證。當用戶想要登錄時,**主網站**和**管理員后臺**使用**OpenID Connect**(**OIDC**) 協議將用戶重定向到\*\*身份驗證服務器。\*\*下圖顯示了登錄過程:

它的邏輯順序是這樣的:
* 當用戶想要訪問主站時 **(1)**,主站將用戶重定向到身份驗證服務 **(2)**。
* 身份驗證服務有一個登錄頁面,用戶可以輸入用戶名和密碼或注冊為新用戶。登錄完成后,用戶將重定向回主站,并返回授權碼 **(3)** 和 **(4)**。
* 然后,主站使用獲得的授權碼向服務器執行令牌請求 **(5)**。
* 身份驗證服務返回一個標識符(包含一些用戶信息,例如用戶名、ID、電子郵件等)和一個訪問令牌 **(6)**。
* 主站將訪問令牌存儲在 cookie 中(管理員后臺將令牌存儲在瀏覽器的本地存儲中),以便在下一個請求中獲取。在接下來的請求中,它從 cookie 中獲取訪問令牌并將其添加到 HTTP 請求頭中,同時對Main HTTP API執行 HTTP 請求 **(7)**。
* Main HTTP API 驗證訪問令牌 **(8)** 并授權請求。
所有這些過程都由 ABP的`Account`和`IdentityServer`模塊完成。
## 探索解決方案
[EventHub.NET](http://EventHub.NET) 解決方案由多個項目組成,按應用類型分組,如下圖所示:

該解決方案有兩個應用層和一個領域層,以及相應的 HTTP API 和**用戶界面**(**UI**) 層。兩個應用層共享領域層,但它們具有不同的應用程序邏輯,因此它們是分開的。
### common 文件夾
我們先介紹`common`文件夾。該文件夾包含通用庫和服務,如下所述:
* `EventHub.Domain`項目是包含實體、領域服務和其他領域對象的領域層。`EventHub.Domain.Shared`項目包含常量和一些其他類,它們是所有層和應用的共享層。
* `EventHub.EntityFrameworkCore`項目包含`DbContext`、映射、數據庫遷移、存儲庫實現以及與 EF Core 相關的其他代碼。
* `EventHub.DbMigrator`項目是一個控制臺應用,用于數據庫遷移并初始化數據(例如管理員用戶/角色及其權限),支持開發和生產環境。
* `EventHub.BackgroundServices`項目是另一個控制臺應用,用于運行后臺作業。
### www 文件夾
`www`文件夾包含主站項目:
* `EventHub.Application`包括應用服務的實現,`EventHub.Application.Contracts`包括應用服務接口和DTO。
* `EventHub.HttpApi`包含 UI(Web)層使用的 API 控制器,該控制器是應用服務的簡單包裝器。
* `EventHub.HttpApi.Host`托管 HTTP API 層。通過這種方式,托管邏輯與包含 API 控制器的項目分離(重用`EventHub.HttpApi`)。
* `EventHub.HttpApi.Client`一個調用 API 的客戶端。UI (web) 層使用該項目來調用 HTTP API。該項目使用 ABP 的動態 C# 代理功能。
* `EventHub.Web`是應用程序的 UI 層。這是一個典型的 Razor Pages 應用。它沒有數據庫連接,調用**Main HTTP API**進行操作。
* `EventHub.Web.Theme`自定義主題。ABP 有一個主題系統,您可以使用它來構建自己的主題并在其他應用中重用它們。`EventHub.Web`項目使用此主題。主題系統將在*第 4 部分*,*用戶界面和 API 開發*中介紹。
### admin 文件夾
`admin`文件夾包含管理員后臺,由維護系統的用戶使用,這里有更詳細的解釋:
* `EventHub.Admin.Application`項目是管理員后臺的應用層,包含應用服務的實現,`EventHub.Admin.Application.Contracts`包含與UI層共享的應用服務接口和DTO。
* `EventHub.Admin.HttpApi`包含 UI(Web)層使用的 API 控制器。
* `EventHub.Admin.HttpApi.Host`項目托管 HTTP API 層。通過這種方式,托管邏輯與包含 API 控制器的項目分離。
* `EventHub.Admin.HttpApi.Client`項目是一個調用 API 的客戶端。UI (web) 層使用該項目來調用 HTTP API。該項目使用 ABP 的動態 C# 代理功能。
* `EventHub.Admin.Web`項目是應用程序的 UI 層。這是一個在瀏覽器中運行并對服務器執行 HTTP API 調用的Blazor WebAssembly應用。
### account 文件夾
`account`文件夾包含單個項目`EventHub.IdentityServer`,其他應用程序使用該項目對用戶進行身份驗證。
我們已經簡要地介紹了解決方案中的所有項目,下面介紹項目之間的依賴關系。
## 項目依賴關系
在接下來的部分中,我將展示每個項目的依賴關系圖,以便您了解代碼庫的組織方式。我們從基本應用程序**主站開始。**
### Main Application(主站)
請記住,**主站**是互聯網**終端用戶**使用應用程序:[www.openeventhub.com](http://www.openeventhub.com/)。下圖顯示了項目依賴關系,從應用程序的根項目`Web`開始:

該`Web`項目依賴于`Web.Theme`,它實現了 EventHub 的 UI 主題。`Web.Theme`是一個單獨的項目,因為它同時被**Authentication Server**復用。
項目`Web`也依賴于`HttpApi`項目。我們可以在Web項目的客戶端 (JavaScript) 中調用這些 API,當您通過`HttpApi.Client`調用 HTTP API 時,請求將重定向到 **Main HTTP API** (后端)。
>[success] 請注意,`HttpApi`和`HttpApi.Client` 都引用了`Application.Contacts`項目。
`HttpApi`引用`.Contracts`接口層,而`HttpApi.Client`使用 ABP 的動態 C# 代理實現了這些接口,并通過執行HTTP遠程調用**Main HTTP API**。
### Main HTTP API(主站API)
**主站**使用**Main HTTP API**作為后端 API。它包含應用領域邏輯。下圖顯示了根項目`HttpApi.Host`及其直接或間接依賴項:

* 通過引用(添加依賴)`HttpApi`項目(包括 API 控制器),客戶端可以響應 HTTP API 調用;
* HTTP API 控制器使用`Application.Contracts`項目中定義的服務接口,而這些接口由`Application`項目實現,這就是為什么我們需要在`HttpApi.Host`項目中引用`Application`項目,而`Application`往下依賴的是`Domain`層,通過它來執行業務邏輯。
* `HttpApi.Host`項目還引用了該`EntityFrameworkCore`項目,因為我們在運行時需要一個數據層。該`EntityFrameworkCore`項目將實體映射到數據庫中的表,并實現了`Domain`項目中定義的存儲庫接口。
請注意,`Application.Contracts`項目,以及`Domain.Shared`項目由客戶端程序**Main Website**共享(以及`Domain.Shared`項目是間接被共享),因此它們可以依賴相同的應用程序接口進行通信。
我們現在已經了解了**主站**應用程序,下一部分介紹管理員后臺:
### Admin Application(管理員站)
管理員后臺站點的前端采用的是Blazor WebAssembly技術,它有一組不同的 API、UI 頁面、授權規則、緩存要求等。它有不同的應用層和 HTTP API 層,共享相同的領域層,使用相同的領域邏輯和相同的數據庫。
如下圖所示:

此圖很簡單。`Admin.Web`項目(即 Blazor WebAssembly )引用`Admin.HttpApi.Client`項目,因為它需要調用遠程 HTTP API。而項目`Admin.HttpApi.Client`依賴于`Admin.Application.Contracts`項目(內部依賴于`Domain.Shared`項目),目的是要使用其中定義的應用服務接口。
### Admin HTTP API(管理員站 API)
管理員站點調用**Admin HTTP API**。它運行著管理員后臺的應用邏輯。下圖顯示了根項目`Admin.HttpApi.Host`及其直接和間接依賴項:

該圖與**Main HTTP API**非常相似。區別在于他們具有不同的 HTTP API 和應用層。但是使用相同的**領域**和數據庫集成 (`EntityFrameworkCore`) 層。
### 認證服務器
**Authentication Server**的根項目是`IdentityServer`,依賴關系如下:

`IdentityServer`項目和主站一樣,也引用`Web.Theme`,它還引用了`EntityFrameworkCore`項目。通過引用`EntityFrameworkCore`項目,也間接引用了`Domain`和`Domain.Shared`項目。
### 后臺服務
`BackgroundServices`項目具有下圖所示的依賴項:

`BackgroundServices`項目引用`EntityFrameworkCore`,以便操作數據庫,它還可以使用**領域**對象(實體、域服務)來執行后臺任務。
我們已經介紹完了解決方案中的所有項目。現在,我們準備在本地開發環境中運行它們。
- 前言
- 第一部分
- 第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測試基礎設施
- 構建單元測試
- 構建集成測試