淺談ABP最佳實踐


目錄

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

 

ABP概念簡述

ABP是“ASP.NET Boilerplate Project (ASP.NET樣板項目)”的簡稱。它基於DDD的經典“分層架構”思想,開發了便捷的功能模塊。

 

 

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對所有類的參數的驗證和規范化。

 

 

 

通過對參數有效性驗證和規范化處理,使得輸入參數在進入應用程序時就是符合要求的。讓我們可以更專注“應用程序層”的業務邏輯。使代碼更加規整,可讀性也更高。

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM