淺談ABP最佳實踐

目錄

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

 

ABP概念簡述

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

 

 

ABP在【事務操做】上的簡便性

以一個最簡單的學生選課爲例,包含學生、課程、選課結果三個實體。數據庫

在學生選課過程當中,當學生選課後,會進行兩個操做:架構

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中是很容易實現的。

 

 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對全部類的參數的驗證和規範化。

 

 

 

經過對參數有效性驗證和規範化處理,使得輸入參數在進入應用程序時就是符合要求的。讓咱們能夠更專一「應用程序層」的業務邏輯。使代碼更加規整,可讀性也更高。

相關文章
相關標籤/搜索