1.1 ABP總體介紹 - 入門介紹
ABP是“ASP.NET Boilerplate Project (ASP.NET樣板項目)”的簡稱。
ASP.NET Boilerplate是一個用最佳實踐和流行技術開發現代WEB應用程序的新起點,它旨在成為一個通用的WEB應用程序基礎框架和項目模板。
ASP.NET Boilerplate 基於DDD的經典分層架構思想,實現了眾多DDD的概念(但沒有實現所有DDD的概念)。
ABP的官方網站:http://www.aspnetboilerplate.com
ABP在Github上的開源項目:https://github.com/aspnetboilerplate
ABP框架於2014年5月4日首次在Github開源,截止到2018年3月30日,總共進行了4582次代碼提交,163次版本發布,現在的版本號是3.5。
1.1.1 ABP采用了以下技術
服務器端:
- ASP.NET MVC 5、Web API 2、C# 5.0
- DDD領域驅動設計 (Entities、Repositories、Domain Services、Domain Events、Application Services、DTOs等) Castle windsor (依賴注入容器)
- Entity Framework 6 \ NHibernate,數據遷移Log4Net(日志記錄)
- AutoMapper(實現Dto類與實體類的雙向自動轉換)
客戶端:
-
Bootstrap Less AngularJs jQuery Modernizr
-
其他JS庫: jQuery.validate、jQuery.form、jQuery.blockUI、json2
1.1.2 ABP框架已實現了以下特性
-
多語言/本地化支持
-
多租戶支持(每個租戶的數據自動隔離,業務模塊開發者不需要在保存和查詢數時寫相應代碼)
-
軟刪除支持(繼承相應的基類或實現相應接口,會自動實現軟刪除)
-
統一的異常處理(應用層幾乎不需要處理自己寫異常處理代碼)
-
數據有效性驗證(Asp.NET MVC只能做到Action方法的參數驗證,ABP實現了Application層方法的參數有效性驗證)
-
日志記錄(自動記錄程序異常)
-
模塊化開發(每個模塊有獨立的EF DbContext,可單獨指定數據庫)
-
Repository倉儲模式(已實現了Entity Framework、NHibernate、MangoDB、內存數據庫)
-
Unit Of Work工作單元模式(為應用層和倉儲層的方法自動實現數據庫事務)
-
EventBus實現領域事件﴾Domain Events﴿
-
DLL嵌入資源管理
-
通過Application Services自動創建Web Api層(不需要寫ApiController層了)
-
自動創建Javascript 的代理層來更方便使用Web Api
-
封裝一些Javascript 函數,更方便地使用ajax、消息框、通知組件、忙狀態的遮罩層
“Zero”的模塊,實現了以下功能:
-
身份驗證與授權管理(通過ASP.NET Identity實現的)
-
用戶&角色管理
-
系統設置存取管理(系統級、租戶級、用戶級,作用范圍自動管理)
-
審計日志(自動記錄每一次接口的調用者和參數)
在其他項目中的很多優秀設計,在ABP項目中也已存在,而且可能實現得更好。ABP框架的代碼,都通過xUnit進行了單元測 試。作者一直在用ABP框架開發他們的實際項目,從Github和他官方論壇上的信息可以看到,有很多國外的開發者在將ABP用 作生產項目的基礎框架。如果需要直接使用ABP組件,可以通過Nuget安裝(在VS的Nuget包管理界面搜索ABP)。 為了更好地將ABP適用於自己的項目,我對ABP的源碼做了一些修改后使用的,沒有直接使用ABP組件。 我希望更多國內的架構師能關注ABP這個項目,也許這其中有能幫助到你的地方,也許有你的參與,這個項目可以發展得更好。 今天只是作了一個大概介紹,希望有更多的朋友能去閱讀源代碼,然后參與討論。
1.1.3 ABP適用的場景
中小規模WEB應用開發,可直接使用ABP框架。 較大型項目可以在ABP框架的源碼基礎上進行擴展,以實現分布式架構。
注:處理高並發並不是ABP的強項。需要非常高並發的DDD框架,建議去研究netfocus的ENode。
1.2 ABP總體介紹 - 層架構體系
1.2.1 前言
為了減少復雜性和提高代碼的可重用性,采用分層架構是一種被廣泛接受的技術。
為了實現分層的體系結構,ABP遵循 DDD(領域驅動設計)的原則,將工程分為四個層:
-
展現層(Presentation):向用戶提供一個接口﴾UI﴿,使用應用層來和用戶﴾UI﴿進行交互。
-
應用層(Application):應用層是表現層和領域層能夠實現交互的中間者,協調業務對象去執行特定的應用任務
-
領域層(Domain):包括業務對象和業務規則,這是應用程序的核心層。
-
基礎設施層(Infrastructure):提供通用技術來支持更高的層。例如基礎設施層的倉儲﴾Repository﴿可通過ORM來實現數據庫交互,或者提供發送郵件的支持。
根據實際需要,可能會有額外添加的層。例如:
- 分布式服務層(Distributed Service) :用於公開應用程序接口供遠程客戶端調用。比如通過ASP.NET Web API或WCF來實現。
這些都是常見的以領域為中心的分層體系結構。不同的項目在實現上可能會有細微的差別.
1.2.2 ABP的體系結構
層次結構概覽如下圖所示:
一個簡單的解決方案,大致包含5個項目:
一個層可以被實現為一個或者多個程序集。對於大項目的第三方依賴創建多個應用程序集這是一個好的選擇﴾例如:這里的 EntityFramework﴿。還有,在有限界上下文中,每個上下文都有它自己的分層。
1.2.3 領域層
領域層是實現所有業務規則的地方。
-
實體(Entity): 實體代表業務領域的數據和操作,在實踐中,通常用來映射成數據庫表。
-
倉儲(Repository): 倉儲是像集合一樣的對象,用來在數據源﴾數據庫﴿上檢索和存儲實體。在領域層定義倉儲,但是不實現它們。它們在基礎設施層被實現。
-
領域服務(Domain service): 當處理的業務規則跨越兩個﴾及以上﴿實體時,應該寫在領域服務方法里面。
-
領域事件(Domain Event): 領域事件被用來定義特定於領域的事件,並且觸發使用它們。領域服務與實體﴾以及其他領域對象﴿一起實現了不屬於單個實體的業務規則。
-
工作單元(Unit of Work): 工作單元是一種設計模式被用來管理數據庫連接和事務,以及跟蹤實體更改,並將這些更改保存 到數據存儲中。它被定義在領域層中,但是在基礎設施層實現它們。
1.2.4 應用層
應用層提供一些應用服務(Application Services)方法供展現層調用。一個應用服務方法接收一個DTO﴾數據傳輸對象﴿作為輸入 參數,使用這個輸入參數執行特定的領域層操作,並根據需要可返回另一個DTO。在展現層到領域層之間,不應該接收或返回 實體﴾Entity﴿對象,應該進行DTO映射。 一個應用服務方法通常被認為是一個工作單元(Unit of Work)。用戶輸入參數的驗證 工作也應該在應用層實現。ABP提供了一個基礎架構讓我們很容易地實現輸入參數有效性驗證。建議使用一種像AutoMapper這 樣的工具來進行實體與DTO之間的映射。
1.2.5 基礎設施層
當在領域層中為定義了倉儲接口,應該在基礎設施層中實現這些接口。可以使用ORM工具,例如EntityFramework或 NHibernate。ABP的基類已經提供了對這兩種ORM工具的支持。數據庫遷移也被用於這一層。
1.2.6 WEB與展現層
Web層使用ASP.NET MVC和Web API來實現。可分別用於多頁面應用程序﴾MPA﴿和單頁面應用程序﴾SPA﴿。 在SPA中,所有資源被一次加載到客戶端瀏覽器中(或者先只加載核心資源,其他資源懶加載),然后通過AJAX調用服務端 WebApi接口獲取數據,再根據數據生成HTML代碼。不會整個頁面刷新。現在已經有很多SPA的JS框架,例如: AngularJs、 DurandalJs、BackboneJs、EmberJs。 ABP可以使用任何類似的前端框架,但是ABP提供了一些幫助類,讓我們更方便地使用 AngularJs和DurandalJs。 在經典的多頁面應用(MPA)中,客戶端向服務器端發出請求,服務器端代碼(ASP.NET MVC控制器)從數據庫獲得數據,並 且使用Razor視圖生成HTML。這些被生成后的HTML頁面被發送回客戶端顯示。每顯示一個新的頁面都會整頁刷新。 SPA和MPA涉及到完全不同的體系結構,也有不同的應用場景。一個管理后台適合用SPA,博客就更適合用MPA,因為它更利 於被搜索引擎抓取。 SignalR是一種從服務器到客戶端發送推送通知的完美工具。它能給用戶提供豐富的實時的體驗。 已經有很多客戶端的 Javascript框架或庫,JQuery是其中最流行的,並且它有成千上萬免費的插件。使用Bootstrap可以讓我們更輕松地完成寫Html 和CSS的工作。 ABP也實現了根據Web API接口自動創建 Javascript的代碼函數,來簡化JS對Web Api的調用。還有把服務器端的菜單、語言、 設置等生成到JS端。(但是在我自己的項目中,我是把這些自動生成功能關閉的,因為必要性不是很大,而這些又會比較影響 性能)。 ABP會自動處理服務器端返回的異常,並以友好的界面提示用戶。
1.2.7 其它
ABP使用Castle Windsor為整個程序框架提供依賴注入的功能。使用Log4Net日志記錄組件,提供給其他各層調用以進行日志記 錄。
1.3 ABP總體