目錄
- ABP概念簡述
- ABP在【事務操作】上的簡便性
- ABP在【關聯查詢】上的“美”和“坑”
- ABP的【參數驗證】方式
ABP概念簡述

ABP在【事務操作】上的簡便性
以一個最簡單的學生選課為例,包含學生、課程、選課結果三個實體。
在學生選課過程中,當學生選課后,會進行兩個操作:
1.增加學生選課記錄。
2.增加課程班級人數。
這兩個過程應該是事務型的操作,如果某個過程失敗,則整個過程回滾。
在基於EntityFramework的框架中,通過可以使用TransactionScope實現
using (TransactionScope tran = new TransactionScope()) { ... tran.Complete(); }
在ABP中實現如下,在AddSC()方法中不用任何關於事務的聲明語句,使得整個過程的非常便捷。
這是因為ISCService繼承了IApplicationService服務,IApplicationService即為“應用程序層”的基類。
ABP框架在“應用程序層”具有先天的事務性。所以在程序中,無須聲明事務范圍,實體更新后也不用saveChanges()。
“應用程序層”中的方法都被默認成了事務型操作。當方法成功執行后,會自動提交到數據庫;當方法中的任意一個操作失敗,整個操作都會自動回滾。
此外,如果某個“應用程序層”的方法對底層數據庫只有查詢操作,也可以給方法添加Attribute標簽:[UnitOfWork(false)],來取消對某個方法的事務性限制。
ABP在【關聯查詢】上的“美”和“坑”
如果想查看某個學生所有的選課記錄,在ABP中是很容易實現的。
ABP通過延時加載來根據外鍵關系來查找,把關聯查詢更加簡便和優雅(比EF便捷許多)。
但是不可被美色蠱惑,此處有“暗坑”:被加載的List<Models.SC>具有延時加載特性,如果延時加載的對象在該工作單元內沒有被調用,則對象會在方法結尾處自動被GC回收掉。
如果要在Api層調用GetClassByStudent方法,就必須要激活延時加載的對象。延時加載的對象只要被引用,就會自動被激活。如:
... student.SCs= student.SCs;//引用延時加載對象,從而達到激活的目的 var classes = student.SCs; ...
ABP【參數驗證】方式
對某個方法的操作,對接收的參數的有效性往往需要校驗,注入某些參數是必填的、某個數據的格式必須是合乎規范的等等。在.net mvc中繼承Controller的類,可以通過實現接口IValidatableObject來驗證mvc層的參數輸入。但是無法驗證非繼承Controller的類。
在ABP框架中通過ICustomValidate和INormalize對所有類的參數的驗證和規范化。
通過對參數有效性驗證和規范化處理,使得輸入參數在進入應用程序時就是符合要求的。讓我們可以更專注“應用程序層”的業務邏輯。使代碼更加規整,可讀性也更高。