ABP開發(fā)框架前后端開發(fā)系列---(1)框架的總體介紹

ABP是ASP.NET Boilerplate的簡稱,ABP是一個開源且文檔友好的應(yīng)用程序框架。ABP不僅僅是一個框架,它還提供了一個最徍實踐的基于領(lǐng)域驅(qū)動設(shè)計(DDD)的體系結(jié)構(gòu)模型。學(xué)習(xí)使用ABP框架也有一段時間了,一直想全面了解下這個框架的整個來龍去脈,并把想把它使用歷程整理成一個系列出來,不過一直沒有下筆來寫這篇文章的開篇,就是希望能夠深入了解,再深入了解一些,希望自己能夠理解透徹一些,不能誤人子弟,也不想和網(wǎng)上千篇一律的翻譯官網(wǎng)的內(nèi)容,官網(wǎng)的英文介紹也已經(jīng)很詳細(xì)了,于是我覺得還是以實際使用的過程進行一定的整理會更好。

初次了解ABP框架,對它還是非常驚艷的,它基本上是.NET 領(lǐng)域架構(gòu)的集大成者,幾乎囊括了我們.NET領(lǐng)域排的上名的各種技術(shù)應(yīng)用,而且它本身可以支持.net framework和.net core兩種技術(shù)流派,對它的介紹也是非常感興趣。

1)ABP框架的特點

我們來大概了解下ABP框架涉及到的內(nèi)容。

  • 依賴注入,這個部分使用 Castle windsor (依賴注入容器)來實現(xiàn)依賴注入,這個也是我們經(jīng)常使用IOC來處理的方式;
  • Repository倉儲模式,已實現(xiàn)了Entity Framework、NHibernate、MangoDB、內(nèi)存數(shù)據(jù)庫等,倉儲模式可以快速實現(xiàn)對數(shù)據(jù)接口的調(diào)用;
  • 身份驗證與授權(quán)管理,可以使用聲明特性的方式對用戶是否登錄,或者接口的權(quán)限進行驗證,可以通過一個很細(xì)粒度的方式,對各個接口的調(diào)用權(quán)限進行設(shè)置;
  • 數(shù)據(jù)有效性驗證,ABP自動對接口的輸入?yún)?shù)對象進行非空判斷,并且可以根據(jù)屬性的申請信息對屬性的有效性進行校驗;
  • 審計日志記錄,也就是記錄我們對每個接口的調(diào)用記錄,以及對記錄的創(chuàng)建、修改、刪除人員進行記錄等處理;
  • Unit Of Work工作單元模式,為應(yīng)用層和倉儲層的方法自動實現(xiàn)數(shù)據(jù)庫事務(wù),默認(rèn)所有應(yīng)用服務(wù)層的接口,都是以工作單元方式運行,即使它們調(diào)用了不同的存儲對象處理,都是處于一個事務(wù)的邏輯里面;
  • 異常處理,ABP框架提供了一整套比較完善的流程處理操作,可以很方便的對異常進行進行記錄和傳遞;
  • 日志記錄,我么可以利用Log4Net進行常規(guī)的日志記錄,方便我們跟蹤程序處理信息和錯誤信息;
  • 多語言/本地化支持,ABP框架對多語言的處理也是比較友好的,提供了對XML、JSON語言信息的配置處理;
  • Auto Mapping自動映射,這個是ABP的很重要的對象隔離概念,通過使用AutoMaper來實現(xiàn)域?qū)ο蠛虳TO對象的屬性映射,可以隔離兩者的邏輯關(guān)系,但是又能輕松實現(xiàn)屬性信息的賦值;
  • 動態(tài)Web API層,利用這個動態(tài)處理,可以把Application Service 直接發(fā)布為Web API層,而不需要在累贅的為每個業(yè)務(wù)對象手工創(chuàng)建一個Web API的控制器,非常方便;
  • 動態(tài)JavaScript的AJax代理處理,可以自動創(chuàng)建Javascript 的代理層來更方便使用Web Api,這個在Web層使用。

除了這些重要特性外,ABP框架還有很多一些特別的功能或者概念。

  • 多租戶支持(每個租戶的數(shù)據(jù)自動隔離,業(yè)務(wù)模塊開發(fā)者不需要在保存和查詢數(shù)據(jù)時寫相應(yīng)代碼;
  • 軟刪除支持(繼承相應(yīng)的基類或?qū)崿F(xiàn)相應(yīng)接口,會自動實現(xiàn)軟刪除)
  • 系統(tǒng)設(shè)置存取管理(系統(tǒng)級、租戶級、用戶級,作用范圍自動管理)
  • EventBus實現(xiàn)領(lǐng)域事件(Domain Events)
  • 模塊以及模塊的依賴關(guān)系實現(xiàn)插件化的模塊處理等等

ABP框架主要還是基于領(lǐng)域驅(qū)動的理念來構(gòu)建整個架構(gòu)的,其中領(lǐng)域驅(qū)動包含的概念有 域?qū)ο驟ntities、倉儲對象Repositories、域服務(wù)接口層Domain Services、域事件Domain Events、應(yīng)用服務(wù)接口Application Services、數(shù)據(jù)傳輸對象DTOs等。一般簡化來說,我們可以只需要保留域?qū)ο螅瑯?biāo)準(zhǔn)倉儲對象(不用自定義倉儲接口)、應(yīng)用服務(wù)接口和DTO對象即可,域服務(wù)層接口層和自定義的倉儲對象一般情況下可以省略,后面我會介紹這個內(nèi)容,也就是利用這些對象及關(guān)系,快速構(gòu)建一個易于使用的ABP框架分層。

ABP官方網(wǎng)站:http://www.aspnetboilerplate.com,從里面可以查看很詳細(xì)的案例和文檔說明,可以根據(jù)需要下載不同類型的基礎(chǔ)框架。

ABP GitHub源碼地址:https://github.com/aspnetboilerplate,可以下載整個基礎(chǔ)的框架內(nèi)容,以及相關(guān)的樣板案例代碼。

下面是一個比較直觀的ABP框架分層架構(gòu)圖。

image

上圖只是一個大概的介紹,其實客戶端部分,還應(yīng)該包括Winform客戶端、控制臺客戶端、WPF客戶端等內(nèi)容,而瀏覽器的前端-Web前端,還可以包含使用Ant-Design(React)、IView(VUE)、Angular等不同的前端技術(shù)來承載界面呈現(xiàn)層。而底層的數(shù)據(jù)庫支持,還可以接入更多的,包括MS Sqlserver、Oracle、Mysql、PostgreSQL、SQLite等數(shù)據(jù)庫。

我們可以看到展現(xiàn)層、應(yīng)用層、領(lǐng)域?qū)印⒊志没瘜拥葞讉€不同的分層,每個分層似乎都很好,但是可能需要落實到實處進行進一步的了解,由于目前.net core的技術(shù)應(yīng)用逐漸走向主流,我們就以它的.net core方向進行介紹解讀。

2) Web API優(yōu)先的架構(gòu)

縱觀整個ABP框架,它的核心還是主要以 .NET 的后端技術(shù)為主線,也是著重筆墨的部分,在其展現(xiàn)層中,雖然Asp.NET MVC(包括.net Core部分)和Web API作為兩個部分,但它的動態(tài)發(fā)布Web API,更為Web API優(yōu)先的架構(gòu)提供了很好的便利。

在當(dāng)今流行的展現(xiàn)層中,越來越不依賴于后端的技術(shù)實現(xiàn),而側(cè)重于Web API標(biāo)準(zhǔn)化的對接,基于JSON數(shù)據(jù)的交互處理。不管是以Ant-Design(React)、IView(VUE)、Angular等技術(shù)應(yīng)用的Web前端,我們可以看到這些架構(gòu)很容易實現(xiàn)對Web API的標(biāo)準(zhǔn)接口對接,在我較早提供的Winform混合框架里面,也是以Web API優(yōu)先的策略進行云端應(yīng)用的部署。如下圖是我在博客《Web API應(yīng)用架構(gòu)設(shè)計分析(1)》、《Web API應(yīng)用架構(gòu)設(shè)計分析(2)》、《Web API接口設(shè)計經(jīng)驗總結(jié)》、《Winform混合式開發(fā)框架訪問Web API接口的處理》、《Web API應(yīng)用架構(gòu)在Winform混合框架中的應(yīng)用(3)--Winform界面調(diào)用WebAPI的過程分解》等文章中的闡述。

image
image
image

作為ABP框架的核心、Web API動態(tài)發(fā)布,為其展現(xiàn)層提供了非常方便的途徑,使得我們可以在利用其強大的后端架構(gòu)的基礎(chǔ)上,整合了很多.NET的很多技術(shù)應(yīng)用,如前面介紹的很多ABP框架的特性。

前面介紹了基于Web API優(yōu)先應(yīng)用的特點,可以為我們產(chǎn)品線的快速擴展提供了很好的技術(shù)支撐,而ABP框架是一個比較強大、健壯,而且是集眾多.NET優(yōu)秀技術(shù)應(yīng)用的集大成者,雖然整合使用ABP框架會比較一般的框架需要花費多一些時間,不過在構(gòu)建比較大型,又需要強大的后臺的需求下,這種應(yīng)用場景是非常不錯的,也是一個很好的投資。

3)ABP 框架的項目結(jié)構(gòu)

ABP框架,包含了兩個部分,一個基礎(chǔ)的ABP框架實現(xiàn)(地址https://github.com/aspnetboilerplate/aspnetboilerplate),這個是我們所說的ABP框架的核心實現(xiàn);

image

一個是基于這個基礎(chǔ)上擴展應(yīng)用的ABP框架,它整合了框架核心部分,并提供了一些基礎(chǔ)處理模塊,如人員、角色、權(quán)限、會話、身份驗證、多租戶、日志記錄等等內(nèi)容,我們一般指的ABP框架應(yīng)用就是這個基礎(chǔ)上擴展自己的業(yè)務(wù)項目。這個部分,我們可以根據(jù)官網(wǎng)上進行一定的選項配置,然后下載使用。

image

下載.net core 項目后,其中后端部分的項目視圖如下所示。

image

我們從這個項目里面可以看到,它主要是分為下面幾個項目分層。

Application應(yīng)用層:應(yīng)用層提供一些應(yīng)用服務(wù)(Application Services)方法供展現(xiàn)層調(diào)用。一個應(yīng)用服務(wù)方法接收一個DTO(數(shù)據(jù)傳輸對象)作為輸入?yún)?shù),使用這個輸入?yún)?shù)執(zhí)行特定的領(lǐng)域?qū)硬僮鳎⒏鶕?jù)需要可返回另一個DTO。

Core領(lǐng)域核心層,領(lǐng)域?qū)泳褪菢I(yè)務(wù)層,是一個項目的核心,所有業(yè)務(wù)規(guī)則都應(yīng)該在領(lǐng)域?qū)訉崿F(xiàn)。這個項目里面,除了定義所需的領(lǐng)域?qū)嶓w類外,其實可以定義我們自己的自定義的倉儲對象(類似DAL/IDAL),以及定義自己的業(yè)務(wù)邏輯層(類似BLL/IBLL),以及基于AutoMapper映射規(guī)則等內(nèi)容。

EntityFrameworkCore 實體框架核心層,這個項目不需要修改太多內(nèi)容,只需要在DbContext里面加入對應(yīng)領(lǐng)域?qū)ο蟮膫}儲對象即可。

Migrator數(shù)據(jù)遷移層,這個是一個輔助創(chuàng)建的控制臺程序項目,如果基于DB First,我們可以利用它來創(chuàng)建我們項目的初始化數(shù)據(jù)庫。

Web.Core Web核心層,基于Web或者Web API的核心層,提供了對身份登陸驗證的基礎(chǔ)處理,沒有其他內(nèi)容。

Web.Core.Host Web API的宿主層,也是動態(tài)發(fā)布Web API的核心內(nèi)容,另外在Web API里面整合了Swagger,使得我們可以方便對Web API的接口進行調(diào)試。

Tests 單元測試層,這個提供了一些應(yīng)用層對象的模擬測試,其中測試的數(shù)據(jù)庫使用的是Entity Framework 的內(nèi)存數(shù)據(jù)庫,不影響實際數(shù)據(jù)庫內(nèi)容。

以上是ABP框架的總體情況,我們到現(xiàn)在還沒有正式深入介紹其中的各個部分,以及如果對這些內(nèi)容進行優(yōu)化處理,主要就是介紹一個整體性的ABP框架特性,以及ABP框架側(cè)重的Web API方向,后續(xù)我繼續(xù)對它進行深入的介紹和項目改造,以便適應(yīng)我們實際的ABP項目開發(fā)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,825評論 6 546
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,814評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,980評論 0 384
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 64,064評論 1 319
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 72,779評論 6 414
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 56,109評論 1 330
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,099評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,287評論 0 291
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,799評論 1 338
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,515評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,750評論 1 375
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,221評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,933評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,327評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,667評論 1 296
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,492評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 48,703評論 2 380

推薦閱讀更多精彩內(nèi)容