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