在深入挖掘ABP 框架之前,我想先介紹開發現代企業 Web 解決方案的挑戰,以了解為什么我們需要ABP 框架。讓我們從架構大局開始:
## 架構搭建的挑戰
在開始編碼之前,我們需要為解決方案創建一個基礎。這是構建軟件系統最具挑戰性的階段,在此階段做出的任何決定都可能會影響應用程序的整個生命周期。
有一些常見的、知名的、系統級的架構模式,例如**單體架構**、**模塊化架構**和**微服務架構**。不同的架構選型會決定后續的團隊組織架構、部署和擴展,所以我們要根據需求盡量做最優的選型。
另外,軟件開發模型例如**命令和查詢職責分離**(**CQRS**)、**領域驅動設計**(**DDD**)、**分層架構**和**清潔架構**將決定您的基礎代碼結構。
在這個階段,我們還需要決定將使用哪種語言、框架、工具和庫。
所有這些決策都不是一件容易的事情。
>[warning]我們可以問自己一個問題:我們團隊的軟件架構師和開發人員具備以上這些能力和經營了嗎?
現實是并非所有團隊成員都具有豐富的經驗和知識水平。我們需要從戰略上制定標準規范,在戰術上實踐最佳編碼。
## 重復造輪子!
**不要重復自己**(**DRY**) 是軟件開發的關鍵原則。
>[warning]我們先思考一個問題:為什么我們在構建軟件時會重復自己呢?
身份驗證是每個軟件都需要的功能,包括單點登錄、基于令牌的身份驗證、社交登錄、雙因素身份驗證、忘記/重置密碼、電子郵件激活等等,幾乎所有的軟件項目或多或少都有相似的身份驗證需求。與其從頭開始構建所有這些,不如復用現有的解決方案(例如云服務)更好,不管在實戰還是安全方面都更加穩定成熟。
還有一些非功能性需求,例如異常處理、驗證、授權、緩存、審計日志和數據庫事務管理,是代碼重復源頭。這些關注點被稱為橫切關注點,應該在每個 Web 請求中處理。
當您集成到第三方系統(例如 RabbitMQ 和 Redis)時,您通常會創建抽象和裝飾器。通過這種方式,您的業務邏輯與這些基礎設施組件隔離開來。此外,您不會在系統中到處重復相同的連接、重試、異常處理和日志記錄邏輯。
擁有一個預先構建的基礎架構來自動執行這些重復性工作可以節省您的開發時間,以便您可以專注于您的業務邏輯。
## 構建 UI 基礎
**用戶界面**(**UI**)也是應用的基礎。一個過時且無法使用的 UI 不會那么吸引人,即使它在幕后具有出色的商業價值。
雖然每個應用的 UI 功能和要求各不相同,但一些基本結構是常見的,例如警報、按鈕、卡片、表單元素、選項卡和數據表。您可以使用 HTML/CSS 框架,例如 Bootstrap、Bulma 和 Ant Design,而不是為每個應用程序創建一個設計系統。
幾乎每個 Web 應用程序都有響應式布局,主菜單、工具欄、頁眉和頁腳、自定義顏色等。您將需要為應用的頁面和組件實現基本 UI 工具包。這樣,UI 開發人員可以創建一致的 UI。
到目前為止,我們介紹了一些常見的基礎架構需求,它們大多獨立于任何業務應用。下面討論常見的業務需求。
## 實現常見的業務需求
雖然每個應用系統是獨特的,而且其價值來自于獨特性,但是每個企業系統都有一些基本的配套需求。
基于權限的授權系統是這些基本要求之一。它用于控制應用的用戶和客戶端的權限。如果您想自己實現這一點,您應該創建一個包含數據庫表、授權邏輯、權限緩存、API 和 UI 頁面的端到端解決方案。但是,這樣的系統非常通用,完全可以開發為可重用模塊,由多個應用共同使用。
另外,許多系統需要審計日志報告、租戶和訂閱管理(針對 SaaS 應用)、語言管理、文件上傳和共享、多語言管理和時區管理等功能。除了預先構建的應用功能之外,可能還有低級要求,例如實現軟刪除模式和在應用程序中存儲**二進制大對象(BLOB) 數據。**
所有這些常見的需求都可以從頭開始構建,但是這需要我們耗費巨大的成本和精力,如果你的團隊沒有經驗豐富的架構團隊,還不一定能完成得很好。如果這些功能不是公司的主要價值,我們完全可以考慮開源社區預構建的模塊和庫,并根據特定的要求進行定制。
- 前言
- 第一部分
- 第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測試基礎設施
- 構建單元測試
- 構建集成測試