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

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

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

1)ABP框架的特點(diǎn)

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

  • 依賴(lài)注入,這個(gè)部分使用 Castle windsor (依賴(lài)注入容器)來(lái)實(shí)現(xiàn)依賴(lài)注入,這個(gè)也是我們經(jīng)常使用IOC來(lái)處理的方式井辆;
  • Repository倉(cāng)儲(chǔ)模式关筒,已實(shí)現(xiàn)了Entity Framework、NHibernate杯缺、MangoDB平委、內(nèi)存數(shù)據(jù)庫(kù)等,倉(cāng)儲(chǔ)模式可以快速實(shí)現(xiàn)對(duì)數(shù)據(jù)接口的調(diào)用夺谁;
  • 身份驗(yàn)證與授權(quán)管理,可以使用聲明特性的方式對(duì)用戶(hù)是否登錄肉微,或者接口的權(quán)限進(jìn)行驗(yàn)證匾鸥,可以通過(guò)一個(gè)很細(xì)粒度的方式,對(duì)各個(gè)接口的調(diào)用權(quán)限進(jìn)行設(shè)置碉纳;
  • 數(shù)據(jù)有效性驗(yàn)證勿负,ABP自動(dòng)對(duì)接口的輸入?yún)?shù)對(duì)象進(jìn)行非空判斷,并且可以根據(jù)屬性的申請(qǐng)信息對(duì)屬性的有效性進(jìn)行校驗(yàn)劳曹;
  • 審計(jì)日志記錄奴愉,也就是記錄我們對(duì)每個(gè)接口的調(diào)用記錄,以及對(duì)記錄的創(chuàng)建铁孵、修改锭硼、刪除人員進(jìn)行記錄等處理;
  • Unit Of Work工作單元模式蜕劝,為應(yīng)用層和倉(cāng)儲(chǔ)層的方法自動(dòng)實(shí)現(xiàn)數(shù)據(jù)庫(kù)事務(wù)檀头,默認(rèn)所有應(yīng)用服務(wù)層的接口,都是以工作單元方式運(yùn)行岖沛,即使它們調(diào)用了不同的存儲(chǔ)對(duì)象處理暑始,都是處于一個(gè)事務(wù)的邏輯里面;
  • 異常處理婴削,ABP框架提供了一整套比較完善的流程處理操作廊镜,可以很方便的對(duì)異常進(jìn)行進(jìn)行記錄和傳遞;
  • 日志記錄唉俗,我么可以利用Log4Net進(jìn)行常規(guī)的日志記錄嗤朴,方便我們跟蹤程序處理信息和錯(cuò)誤信息;
  • 多語(yǔ)言/本地化支持互躬,ABP框架對(duì)多語(yǔ)言的處理也是比較友好的播赁,提供了對(duì)XML、JSON語(yǔ)言信息的配置處理吼渡;
  • Auto Mapping自動(dòng)映射容为,這個(gè)是ABP的很重要的對(duì)象隔離概念,通過(guò)使用AutoMaper來(lái)實(shí)現(xiàn)域?qū)ο蠛虳TO對(duì)象的屬性映射,可以隔離兩者的邏輯關(guān)系坎背,但是又能輕松實(shí)現(xiàn)屬性信息的賦值替劈;
  • 動(dòng)態(tài)Web API層,利用這個(gè)動(dòng)態(tài)處理得滤,可以把Application Service 直接發(fā)布為Web API層陨献,而不需要在累贅的為每個(gè)業(yè)務(wù)對(duì)象手工創(chuàng)建一個(gè)Web API的控制器,非常方便懂更;
  • 動(dòng)態(tài)JavaScript的AJax代理處理眨业,可以自動(dòng)創(chuàng)建Javascript 的代理層來(lái)更方便使用Web Api,這個(gè)在Web層使用沮协。

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

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

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

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

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

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

image

上圖只是一個(gè)大概的介紹杖刷,其實(shí)客戶(hù)端部分励饵,還應(yīng)該包括Winform客戶(hù)端、控制臺(tái)客戶(hù)端滑燃、WPF客戶(hù)端等內(nèi)容役听,而瀏覽器的前端-Web前端,還可以包含使用Ant-Design(React)表窘、IView(VUE)典予、Angular等不同的前端技術(shù)來(lái)承載界面呈現(xiàn)層。而底層的數(shù)據(jù)庫(kù)支持乐严,還可以接入更多的熙参,包括MS Sqlserver、Oracle麦备、Mysql、PostgreSQL昭娩、SQLite等數(shù)據(jù)庫(kù)凛篙。

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

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

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

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

image
image
image

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

前面介紹了基于Web API優(yōu)先應(yīng)用的特點(diǎn)思币,可以為我們產(chǎn)品線(xiàn)的快速擴(kuò)展提供了很好的技術(shù)支撐,而ABP框架是一個(gè)比較強(qiáng)大羡微、健壯谷饿,而且是集眾多.NET優(yōu)秀技術(shù)應(yīng)用的集大成者,雖然整合使用ABP框架會(huì)比較一般的框架需要花費(fèi)多一些時(shí)間妈倔,不過(guò)在構(gòu)建比較大型博投,又需要強(qiáng)大的后臺(tái)的需求下,這種應(yīng)用場(chǎng)景是非常不錯(cuò)的盯蝴,也是一個(gè)很好的投資毅哗。

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

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

image

一個(gè)是基于這個(gè)基礎(chǔ)上擴(kuò)展應(yīng)用的ABP框架闽烙,它整合了框架核心部分蒸殿,并提供了一些基礎(chǔ)處理模塊,如人員鸣峭、角色宏所、權(quán)限、會(huì)話(huà)摊溶、身份驗(yàn)證爬骤、多租戶(hù)、日志記錄等等內(nèi)容莫换,我們一般指的ABP框架應(yīng)用就是這個(gè)基礎(chǔ)上擴(kuò)展自己的業(yè)務(wù)項(xiàng)目霞玄。這個(gè)部分骤铃,我們可以根據(jù)官網(wǎng)上進(jìn)行一定的選項(xiàng)配置,然后下載使用坷剧。

image

下載.net core 項(xiàng)目后惰爬,其中后端部分的項(xiàng)目視圖如下所示。

image

我們從這個(gè)項(xiàng)目里面可以看到惫企,它主要是分為下面幾個(gè)項(xiàng)目分層撕瞧。

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

Core領(lǐng)域核心層偏序,領(lǐng)域?qū)泳褪菢I(yè)務(wù)層页畦,是一個(gè)項(xiàng)目的核心,所有業(yè)務(wù)規(guī)則都應(yīng)該在領(lǐng)域?qū)訉?shí)現(xiàn)研儒。這個(gè)項(xiàng)目里面豫缨,除了定義所需的領(lǐng)域?qū)嶓w類(lèi)外,其實(shí)可以定義我們自己的自定義的倉(cāng)儲(chǔ)對(duì)象(類(lèi)似DAL/IDAL)端朵,以及定義自己的業(yè)務(wù)邏輯層(類(lèi)似BLL/IBLL)州胳,以及基于AutoMapper映射規(guī)則等內(nèi)容。

EntityFrameworkCore 實(shí)體框架核心層逸月,這個(gè)項(xiàng)目不需要修改太多內(nèi)容,只需要在DbContext里面加入對(duì)應(yīng)領(lǐng)域?qū)ο蟮膫}(cāng)儲(chǔ)對(duì)象即可遍膜。

Migrator數(shù)據(jù)遷移層碗硬,這個(gè)是一個(gè)輔助創(chuàng)建的控制臺(tái)程序項(xiàng)目,如果基于DB First瓢颅,我們可以利用它來(lái)創(chuàng)建我們項(xiàng)目的初始化數(shù)據(jù)庫(kù)恩尾。

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

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

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

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市唧取,隨后出現(xiàn)的幾起案子铅鲤,更是在濱河造成了極大的恐慌,老刑警劉巖枫弟,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件邢享,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡淡诗,警方通過(guò)查閱死者的電腦和手機(jī)骇塘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)韩容,“玉大人款违,你說(shuō)我怎么就攤上這事∪盒祝” “怎么了插爹?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)请梢。 經(jīng)常有香客問(wèn)我赠尾,道長(zhǎng),這世上最難降的妖魔是什么毅弧? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任气嫁,我火速辦了婚禮,結(jié)果婚禮上够坐,老公的妹妹穿的比我還像新娘寸宵。我一直安慰自己,他們只是感情好元咙,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布梯影。 她就那樣靜靜地躺著,像睡著了一般庶香。 火紅的嫁衣襯著肌膚如雪光酣。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,079評(píng)論 1 285
  • 那天脉课,我揣著相機(jī)與錄音救军,去河邊找鬼财异。 笑死,一個(gè)胖子當(dāng)著我的面吹牛唱遭,可吹牛的內(nèi)容都是我干的戳寸。 我是一名探鬼主播,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼拷泽,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼疫鹊!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起司致,我...
    開(kāi)封第一講書(shū)人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤拆吆,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后脂矫,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體枣耀,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年庭再,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了捞奕。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡拄轻,死狀恐怖颅围,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情恨搓,我是刑警寧澤院促,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站斧抱,受9級(jí)特大地震影響常拓,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜夺姑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望掌猛。 院中可真熱鬧盏浙,春花似錦、人聲如沸荔茬。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)慕蔚。三九已至丐黄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間孔飒,已是汗流浹背灌闺。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工艰争, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人玖翅。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓球匕,卻偏偏與公主長(zhǎng)得像释簿,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子逾柿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

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