AOP的概念簡介
AOP(Aspect-oriented programming)
名詞解釋
Aspect
意思為剖面,Oriented
意思為導向,所以翻譯為剖面導向程式設計
,這意思恐怕很難直接從字面上理解,技術人員就直接用程式來說明吧。
一般我們在寫程式時,很常需要處理譬如錯誤紀錄
、權限驗證
,乃至於額外可能增加使用者查詢歷程
等等,就以錯誤紀錄來說,一個方法(Function)要用Nlog進行錯誤紀錄,通常會是這樣子。
public int TestFunction(int num1, int num2)
{
int result;
try{
result = num1 + num2;
}
catch (Exception ex){
var logger = LogManager.GetLogger(invocation.GetType().FullName);
logger.Error(ex, ex.Message);
}
return result;
}
如果系統不大,就那十幾個方法,複製貼上也就解決,但如果是個大系統,幾百個方法要寫的話,勤勞的人也許可以做幾百次複製貼上,但是生性懶惰的我根本不會想這樣蠻幹,而AOP這個架構的誕生,就是基於要減少類似這樣的重工。
架構
畫個圖來看,一般我們寫的方法流程,基本是這個樣子的。
舉例,每個方法都有自己的兩個驗證機制以及一個錯誤處理,若是有200個方法的話就要做597次的重工,而改採用AOP的架構的話,驗證機制與錯誤處理只要各寫一次,其他方法只要在方法上或者是Service上加個標籤(Attribute),馬上省掉這597次的重工,而此時方法的流程就會呈現如下。
這個圖也就是AOP的中心思想,將主要邏輯與次要邏輯分離,主要邏輯就是方法的商業邏輯,次要邏輯就是諸如錯誤紀錄、查詢歷程等等共用邏輯,之前有聽過一個名詞叫關注點分離
,不知道概念上是不是就是這樣。
如何實作
如果是.Net MVC專案的話,在Controller上可以透過ActionFilter
這個標籤來完成AOP的功能,但無法套用在普通的方法上,目前也沒有Nuget套件可以直接拿來用,要實作的話,可以用Autofac.Extra.DynamicProxy
的Intercept
(攔截)標籤,但是要額外加工,並且自訂Interceptor
(攔截器)的內容,攔截,顧名思義就是在方法執行的時候,先把方法暫停一下,可以取得他傳入的參數以及回傳值的類型,而攔截器定義的內容就是你要為方法進行甚麼樣的處理,例如錯誤紀錄。
使用Autofac的Intercept,在interface或service class上加上這樣的標籤,而方法內容只要專注於商業邏輯就好,如下。
using Autofac.Extras.DynamicProxy;
//例外處理的AOP標籤
[Intercept(typeof(ExceptionLogInterceptor))]
public class Service
{
public int TestFunction(int num1, int num2)
{
return num1 + num2;
}
}
ExceptionLogInterceptor
,就是自訂的Interceptor(攔截器),以這個例子來說,這個Interceptor是我用來處理錯誤紀錄的,如此一來,這個Service的方法都可以處理錯誤紀錄。
要使用Autofac.Extras.DynamicProxy
記得也要裝Autofac(DI Container)
更詳細的實作方法,在接下來的系列文章當中會有更加詳細的說明,請原諒我在這邊賣個關子,敬請期待。
總結
使用AOP架構好處多多,減少重工又可以讓你的程式碼更加簡單易懂,因為共用的邏輯抽離之後,就只需要專注於商業邏輯的撰寫,只是對於C#新手來說,可能門檻比較高,不過整體來說,專案若是套用了AOP架構後,整個大升級,不管幾百幾千的方法,如果要加上一堆共用基制的話,都不用怕啦,人擋殺人,佛擋殺佛,不好意思有點激動:D
後記
- 這邊文章比較少講到一些AOP專業術語或者是更詳細的原理,是基於我個人對AOP的認識,來與大家分享,請各位鞭小力一點 :P
- 好像一直講到
抽離共用邏輯,專注於商業邏輯
,不過因為真的很重要,多提幾次應該也無妨(?)