在系統性介紹整個ABP框架之前,我們首先需要對ABP框架有一個大概的了解,ABP框架的全稱是:Asp.Net Boilerplate Project(即Asp.Net 的樣板項目)顧名思義就是能夠通過當前的項目模板來進行快速的Asp.Net開發,這個項目是一個GitHub上面非常流行的開源項目,整個項目的地址請點擊這里,這個一個非常流行的框架,通過這個框架能夠快速搭建Asp.Net項目,而且能夠做到項目之間的分層,層與層之間通過接口進行調用,而且能夠最大程度上保證整個項目層與層之間的松散耦合,從而做到真正地高內聚和低耦合,而且整個項目真正做到了DDD(領域驅動設計)思想,我們知道在領域驅動設計中,我們可以將整個系統分為四個大的層次,每一個層次都有其特定的功能,所以整個項目整體結構是非常清楚的,下面我們來逐一對這個框架進行論述。
一 概述
首先看看官方文檔對其的解釋
1 什么是Asp.Net Boilerplate?
ABP是一個新的現代網站應用程序的初始環境;它使用了最佳實踐和許多受歡迎的工具。它的目標是成為一個所有人都可以使用,一個適用各種項目目標的應用程序框架以及項目樣版。它做了那些事呢?
服務器端
A 基於最新版的ASP.Net MVC和WebAPI
B 實現了領域驅動設計(Domain Driven Design)(實體, 倉儲, 領域服務, 應用服務, 數據傳輸對象, 工作單元... 等等)
C 實現了分層架構(Layered Architecture)(領域層, 應用層, 表現層和基礎設施層)
D 提供一個開發上可重用的基礎結構以及針對大型項目所需要的模塊,並且這些模塊都是可組合式的
E 采用那些你已經(或可能)已經在使用的最受歡迎框架/類庫
F 提供一個基礎且更易於使用的依賴注入機制(使用Castle Windsor作為DI的容器)
G 提供一個嚴謹的對象模型和基類,輕易的通過對象關系映射(Object-Relational Mapping)。(直接支持EntityFramework和NHibernate)。
H 支持且實現了數據庫遷移(database migration)。
l 引入了一個簡單且具彈性的多語言(localization)系統。
J 為服務器端的全局領域事(domain event)件引入了事件總線(EventBus)
K 管理異常處理和驗證
L 為應用服務創建了動態Web API層
M 提供基類和幫助類予當你需要實現某些通用任務時
N 使用約定大於配置
客戶端
A 為單頁面應用(Single-Page Application)(有AngularJs和Durandaljs)和多頁面應用提供項目樣版。樣版都是基於Twitter Bootstrap。
B 流行的Javascript類庫都被引入進來,並且都已套用預設的配置
C 為了讓調用應用服務(注: 使用動態的Web API層)變得更容易而創建動態Javascript代理(dynamic javascript proxies)
D 為了某些傳遞訊息型任務(Summon task)而引入一些獨特的API,而所謂的傳遞訊息任務像是: 顯示警告和通知,阻塞式UI,發出Ajax請求....等等。
除了上述的那些基礎設施,還有一個名叫zero的模塊正在開發中。它將會提供基於角色和權限的授權系統(實現最終版本的ASP.Net Identity Framework),也提供配置系統,多租戶...等等能力。
2 ABP中的分層架構
ABP系統中采用DDD(領域驅動設計)的思想來構建整個軟件,所以我們在使用代碼的時候明顯能夠感覺到其分層架構的思想,具體的分層結構我們可以通過文字並配合下面的這張圖進行理解。
展現層:當前層提供了一個面向用戶的接口,使用應用層來和用戶進行交互,這里我們可以簡單理解成MVC中的View以及其它可以和用戶進行交互的可視化方式,這一層只用於進行展示。
應用層:應用層是展示層和領域層之間的橋梁,在這一層我們可以定義一些應用的服務,同時定義DTO等一些對象, 同時我們在當前層定義一些常用的驗證、配置、Session等一些常見的和用戶直接交互的一些邏輯等。
領域層:包括一些業務對象和他們之間的一些規則,這個是整個應用的核心部分。
框架層:提供一些的一些服務設施,從而為上面更高層次提供基礎服務,比如ORM以及Data Filters等對象。
看完了這些我們再來通過一張圖片對其有一個大概的了解。
對着這個框架圖,再談一談本人對這個架構的思考與理解:
展示層:前端展示層,及MVC中的V層,以及其它可供與用戶進行交互的方式。
應用層(XXX.Application):主要是通過對外提供REST風格的WebAPI接口(使用ABP框架生成動態WebApi方式時),定義數據傳輸對象DTO,從而直接面向展示層提供接口,在內部會會調用領域層中定義的接口方法進行對外和對內數據操作,另外還會處理一些Authorization, Caching, Audit Logging, Object Mapping, Session等方面的操作,所有的這些都是通過和用戶進行交互來完成的。
領域層(XXX.Core):最重要的是實現對具體業務的抽象建模,構建Model層,另外通過注入IRepository接口實現對Model的各種操作,最終完成實際業務的對接,這個是整個應用系統的核心部分,具體的操作會定義在繼承自IDomainService接口的XXXManager中,並且最后將當前唯一實例注入到Application層中。
架構層(XXX.EntityFrameworkCore):主要是提供一個和底層數據庫進行交互的接口,通過領域層定義Model,然后使用CodeFirst生成數據庫表結構,最后通過IRepository接口和領域層進行交互,另外還可以定義一些Data Filter等一些列的基礎設施服務,通過這些能夠實現為更高一層提供基礎服務。
二 系統特色
1 容器技術
一個大的系統通過構築一個唯一的容器,並通過將接口和實現注入容器來進行交互的方式是一種非常流行的技術,在ABP項目中底層采用 Castle Windsor 作為依賴注入容器,能夠將接口注入到容器中,並且在不同的構造函數中通過注入接口來完成交互,這個在一定的程度上能夠減少代碼之間的耦合性,最終提高代碼的可復用性,最終實現整個軟件系統的高內聚低耦合,最終使整個代碼更加規范,很多大型的項目都會使用依賴注入容器的方式來管理整個項目的核心交互邏輯,是一種非常重要的技術。
2 模塊化設計思想
整個系統通過構築一個個Module作為邏輯上的分割,而且還通過定義統一的抽象基類AbpModule來完成整個ABP框架對底層模塊進行控制,另外通過插件化的思想構築可擴展的軟件熱插拔系統,從而在最大程度上實現軟件系統的規整、可擴展功能,最終使整個軟件系統更加成熟。
3 全面而完整的基礎功能模塊
整個ABP框架集成了非常多而且成熟的技術,諸如:EntityFrameworkCore、IdentityServer、Log4Net、RedisCache等一系列的基礎功能,而且整個框架提供了Asp.Net MVC以及Asp.Net Core 的基礎接口,功能完善,能夠在最大的程度上減少重復造輪子的弊端,這些優點都使得整個框架更有特色,而且整個項目開源,所以能夠按照自己的需要對項目進行定制化開發與維護。
三 項目源碼分析
這里特別進行說明,下面所有代碼分析都是針對ABP3.7.2版本,閱讀時需要注意版本區別
5 ABP中的攔截器之ValidationInterceptor(上)
6 ABP中的攔截器之ValidationInterceptor(下)
7 ABP中的攔截器之AuditingInterceptor
8 ABP中的攔截器之EntityHistoryInterceptor
9 ABP中的攔截器之UnitOfWorkInterceptor(一)
10 ABP中的攔截器之UnitOfWorkInterceptor(二)
11 ABP攔截器之AuthorizationInterceptor