ABP 框架基礎(chǔ)知識
ABP是一個開源且文檔友好的應(yīng)用程序框架龄寞。ABP不僅僅是一個框架雷激,它還提供了一個最徍實踐的基于領(lǐng)域驅(qū)動設(shè)計(DDD)的體系結(jié)構(gòu)模型璧疗,可以支持 .net framework和 .net core兩種技術(shù)流派皆的。
ABP 框架特點
- 依賴注入,這個部分使用 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)限進(jìn)行驗證悟耘,可以通過一個很細(xì)粒度的方式,對各個接口的調(diào)用權(quán)限進(jìn)行設(shè)置织狐;
- 數(shù)據(jù)有效性驗證暂幼,ABP自動對接口的輸入?yún)?shù)對象進(jìn)行非空判斷,并且可以根據(jù)屬性的申請信息對屬性的有效性進(jìn)行校驗移迫;
- 審計日志記錄旺嬉,也就是記錄我們對每個接口的調(diào)用記錄,以及對記錄的創(chuàng)建起意、修改鹰服、刪除人員進(jìn)行記錄等處理病瞳;
- Unit Of Work工作單元模式揽咕,為應(yīng)用層和倉儲層的方法自動實現(xiàn)數(shù)據(jù)庫事務(wù)悲酷,默認(rèn)所有應(yīng)用服務(wù)層的接口,都是以工作單元方式運行亲善,即使它們調(diào)用了不同的存儲對象處理设易,都是處于一個事務(wù)的邏輯里面;
- 異常處理蛹头,ABP框架提供了一整套比較完善的流程處理操作顿肺,可以很方便的對異常進(jìn)行進(jìn)行記錄和傳遞;
- 日志記錄渣蜗,我么可以利用Log4Net進(jìn)行常規(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框架分層架構(gòu)圖
前后端分離的思想,不僅僅可以應(yīng)用在Web的B/S開發(fā)汽绢,同時適用于C/S開發(fā)
- 前端Web端可以使用Ant-Design(React)吗跋、IView(VUE)、Angular等不同的前端技術(shù)來承載界面呈現(xiàn)層
- 前端Client 桌面端可以使用MaterialDesign 設(shè)計規(guī)范,按照Prism或者M(jìn)VMMLight 的MVMVM框架結(jié)合應(yīng)用起來
WEB API 優(yōu)先的架構(gòu)
ABP 框架的核心主要以.NET的后端技術(shù)棧為主線跌宛,雖然ASP.NET CORE MVC和 Web API 分成了兩部分酗宋,但是他的動態(tài)發(fā)布為Web API有限的架構(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)先的策略進(jìn)行云端應(yīng)用的部署
ABP 框架的項目結(jié)構(gòu)
ABP 框架包含了兩個部分旨涝,一個基礎(chǔ)的ABP框架租漂,一個ABP基礎(chǔ)框架上的擴展應(yīng)用。提供了人員人員颊糜、角色哩治、權(quán)限、會話衬鱼、身份驗證业筏、多租戶、日志記錄等等內(nèi)容鸟赫,我們一般指的ABP框架應(yīng)用就是這個基礎(chǔ)上擴展自己的業(yè)務(wù)項目蒜胖。這個部分,我們可以根據(jù)官網(wǎng)上進(jìn)行一定的選項配置抛蚤,然后下載使用台谢。
基礎(chǔ)結(jié)構(gòu)組成部分
Package | Status |
---|---|
Abp NuGet | version |
Abp.AspNetCore | NuGet version |
Abp.Web.Common | NuGet version |
Abp.Web NuGet | version |
Abp.Web.Mvc NuGet | version |
Abp.Web.Api NuGet | version |
Abp.Web.Api.OData | NuGet version |
Abp.Web.Resources | NuGet version |
Abp.Web.SignalR | NuGet version |
Abp.Owin | NuGet version |
Abp.EntityFramework.Common | NuGet version |
Abp.EntityFramework | NuGet version |
Abp.EntityFramework.GraphDiff | NuGet version |
Abp.EntityFrameworkCore | NuGet version |
Abp.NHibernate | NuGet version |
Abp.Dapper | NuGet version |
Abp.FluentMigrator | NuGet version |
Abp.AspNetCore | NuGet version |
Abp.AspNetCore.SignalR | NuGet version |
Abp.AutoMapper | NuGet version |
Abp.HangFire | NuGet version |
Abp.HangFire.AspNetCore | NuGet version |
Abp.Castle.Log4Net | NuGet version |
Abp.RedisCache | NuGet version |
Abp.RedisCache.ProtoBuf | NuGet version |
Abp.MailKit | NuGet version |
Abp.Quartz | NuGet version |
Abp.TestBase | NuGet version |
Abp.AspNetCore.TestBase | NuGet version |
擴展應(yīng)用模板樣式如下,需到官網(wǎng)下載
下載.net core 項目后岁经,其中后端部分的項目視圖如下所示
我們從這個項目里面可以看到朋沮,它主要是分為下面幾個項目分層。
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的接口進(jìn)行調(diào)試蚓炬。
Tests 單元測試層松逊,這個提供了一些應(yīng)用層對象的模擬測試,其中測試的數(shù)據(jù)庫使用的是Entity Framework 的內(nèi)存數(shù)據(jù)庫肯夏,不影響實際數(shù)據(jù)庫內(nèi)容经宏。