導語
在開始文章之前,我給大家舉一個發生在我身邊的例子。我們交付的軟件是面向企業的一錘子買賣,後期可能會存在個別定製化。前期我們直接按項目來走,因爲我們也不知道未來的業務長什麼樣子,只是知道大概的範圍。隨着項目的增長,我們團隊成員直接複製一份代碼,然後修修改改就適配了一個新項目,因爲認爲這麼做最快,因爲是一次性買賣啊。所以,大家也懶得打磨,就這麼交付了。大家可以腦補一下,後面會出現什麼問題?
在深入挖掘ABP 框架之前,我想先介紹開發現代企業 Web 解決方案的挑戰,以瞭解爲什麼我們需要ABP 框架。讓我們從架構開始:
架構搭建的挑戰
選型挑戰
在開始編碼之前,我們需要爲解決方案創建一個適合當前和未來一段時期的架構基礎。這是構建軟件系統最具挑戰性的階段,在此階段做出的任何決定都可能會影響應用程序的整個生命週期。
有一些常見的、知名的、系統級的架構模式,例如單體架構、模塊化架構和微服務架構。不同的架構選型會決定後續的團隊組織架構、部署和擴展,所以我們要根據需求儘量做最優的選型。
另外,軟件開發模型,例如:命令和查詢職責分離(CQRS)、領域驅動設計(DDD)、分層架構和清潔架構將決定您的基礎代碼結構。
在這個階段,我們還需要決定將使用哪種語言、框架、工具和庫。
所有這些決策都不是一件容易的事情。
我們思考一下:我們團隊的軟件架構師和開發人員具備以上這些能力和經營了嗎?
現實是並非所有團隊成員都具有豐富的經驗和知識水平。我們需要從戰略上制定標準規範,在戰術上實踐最佳編碼。
重複造輪子
不要重複自己(DRY) 是軟件開發的關鍵原則。
我們先思考一個問題:爲什麼我們在構建軟件時會重複自己呢?
身份驗證是每個軟件都需要的功能,包括單點登錄、基於令牌的身份驗證、社交登錄、雙因素身份驗證、忘記/重置密碼、電子郵件激活等等,幾乎所有的軟件項目或多或少都有相似的身份驗證需求。與其從頭開始構建所有這些,不如複用現有的解決方案(例如雲服務)更好,不管在實戰還是安全方面都更加穩定成熟。
還有一些非功能性需求,例如異常處理、驗證、授權、緩存、審計日誌和數據庫事務管理,是代碼重複源頭。這些關注點被稱爲橫切關注點,應該在每個 Web 請求中處理。
當您集成到第三方系統(例如 RabbitMQ 和 Redis)時,您通常會創建抽象和裝飾器。通過這種方式,您的業務邏輯與這些基礎設施組件隔離開來。此外,您不會在系統中到處重複相同的連接、重試、異常處理和日誌記錄邏輯。
擁有一個預先構建的基礎架構來自動執行這些重複性工作可以節省您的開發時間,以便您可以專注於您的業務邏輯。
UI 設計和選型
用戶界面(UI)也是應用的基礎。一個過時且無法使用的 UI 不會那麼吸引人,即使它在幕後具有出色的商業價值。
雖然每個應用的 UI 功能和要求各不相同,但一些基本結構是常見的,例如警報、按鈕、卡片、表單元素、選項卡和數據表。您可以使用 HTML/CSS 框架,例如 Bootstrap、Bulma 和 Ant Design,而不是爲每個應用程序創建一個設計系統。
幾乎每個 Web 應用程序都有響應式佈局,主菜單、工具欄、頁眉和頁腳、自定義顏色等。您將需要爲應用的頁面和組件實現基本 UI 工具包。這樣,UI 開發人員可以創建一致的 UI。
到目前爲止,我們介紹了一些常見的基礎架構需求,它們大多獨立於任何業務應用。下面討論常見的業務需求。
實現常見的業務需求
雖然每個應用系統是獨特的,而且其價值來自於獨特性,但是每個企業系統都有一些基本的配套需求。
基於權限的授權系統是這些基本要求之一。它用於控制應用的用戶和客戶端的權限。如果您想自己實現這一點,您應該創建一個包含數據庫表、授權邏輯、權限緩存、API 和 UI 頁面的端到端解決方案。但是,這樣的系統非常通用,完全可以開發爲可重用模塊,由多個應用共同使用。
另外,許多系統需要審計日誌報告、租戶和訂閱管理(針對 SaaS 應用)、語言管理、文件上傳和共享、多語言管理和時區管理等功能。除了預先構建的應用功能之外,可能還有低級要求,例如實現軟刪除模式和在應用程序中存儲二進制大對象(BLOB) 數據。
所有這些常見的需求都可以從頭開始構建,但是這需要我們耗費巨大的成本和精力,如果你的團隊沒有經驗豐富的架構團隊,還不一定能完成得很好。如果這些功能不是公司的主要價值,我們完全可以考慮開源社區預構建的模塊和庫,並根據特定的要求進行定製。
ABP 框架的能力清單
ABP 架構
領域驅動設計
模塊化
-
第一個挑戰是模塊隔離。儘管ASP.NET Core 有一些特性(例如 Razor 組件庫)來支持模塊化。但是,它仍然非常有限,因爲它是一個底層通用的框架,並且僅對 UI 和 API 部分支持。另一方面,ABP 框架提供了一個一致的模型和基礎設施來構建完全隔離的、可重用的應用模塊及數據庫、領域、應用和 UI 層。
-
第二個挑戰是模塊之間如何通信,使之成爲一個統一的應用程序。ABP 爲模塊化系統提供常見的模型,例如在模塊之間共享數據庫,在模塊之間通過事件或 API 進行通信,以及模塊安裝。
模塊化非常適合管理複雜的大型單體系統。但是,ABP 也可以幫助您創建微服務解決方案。
微服務
所有預構建的 ABP 應用模塊都經過設計,以便您可以將它們轉換爲微服務。ABP 也提供了詳細指南來解釋如何創建微服務兼容模塊。這樣,您可以從模塊化單體開始,然後將其轉換爲微服務解決方案。
SaaS/多租戶
-
在租戶之間共享硬件和軟件資源。
-
每個租戶都有用戶、角色和權限。
-
在租戶之間隔離數據庫、緩存和其他資源。
-
可以啓用/禁用每個租戶的應用功能。
-
可以爲每個租戶自定義應用配置。
我們會在[第 16 章]實現多租戶,介紹如何使用 ABP 框架進行多租戶應用開發。
啓動模板
下面談談這個啓動模板:
-
解決方案已經做好邏輯分層。
-
一些預構建模塊,例如Account和Identity模塊。已經實現了基本的登錄、註冊、用戶和角色管理以及其他一些標準功能。
-
預先配置好的 單元測試和集成測試項目。
-
一些管理數據庫遷移以及使用 HTTP API實用工具。
ABP 基礎設施
社區
概括
最後,我們回答一下開頭的那個問題,就是項目增長後出現的問題:代碼庫版本增多了。因爲你不想通過一份代碼在內部做if和else的不同項目判斷,所以你寧願拷貝一份可能是幾百兆的項目代碼,所以第二個問題就是代碼急劇膨脹,佔用大量的代碼庫空間。管理起來十分困難。歸根結底,這一切是可以避免的,ABP給我們一個很好的啓發。不知道讀者君有沒有自己的思路,歡迎留言。
如果你也在學習ABP,也有遇到問題需要諮詢,歡迎你加入ABP的QQ羣(免費)
或者加入我的知識星球(收費),體驗更加及時和全面的服務,感謝您的閱讀。