[Spring.Net]Aop with Nested AroundAdvice

[Spring.Net]Aop with Nested AroundAdvice

前言
上一篇文章『
Aop introduction–以performance log為例』介紹了如何使用Spring.Net來達到Aop的功能,例子是AroundAdvice,用來作performance monitoring。這時候同事罩哥看著Sample code,提出了一個很有趣的問題:如果有兩個以上的AroundAdvice class (實作IMethodInterceptor),那invocation.Proceed()會不會跑兩次?這樣應該很有問題。直覺當然是應該沒問題,如果有問題,Spring也笨了點,不過我也很好奇,會怎麼跑。基於實驗的精神,我們就來測試看看Nested AroundAdvice的執行過程長怎樣囉。

實作
我們新增一支TestByJoey.cs,內容基本上與上一個例子的PerformanceLoggingAroundAdvice.cs一模一樣。接著在Spring設定檔的部分,我們把Spring.Aop.Framework.ProxyFactoryObject的interceptorNames,多injection TestByJoey這個object進去。


	<!--該AOP用到哪一些Service,要加進去Property裡面,該Property是ref到哪一個Service object-->
    <object id="JoeyServiceWithAOP" type="Spring.Aop.Framework.ProxyFactoryObject" >
        <property name="target" ref="JoeyService" />
        <property name="interceptorNames">
            <list>                
                <value>testByJoey</value>
                <value>performanceLoggingAroundAdvice</value>                
            </list>
        </property>
    </object>


要注意一下,我們是把testByJoey放在前面,後面才放performanceLoggingAroundAdvice。
接著我們來看偵錯的情況:

 

1. 會先執行TestByJoey,當執行到invocation.Proceed(),會檢查是否還有其他的around advice,若有,則進入該around advice class。

image

 

 

image

 

2.當進入TestByJoey的invocation.Proceed()後,會進入PerformanceLogging這一支Interceptor,直到沒有其他的around advice,才會實際執行RealSubject的method。

image

 

3.執行完RealSubject的method後,因為是nested的around advice,所以會是先進後出的方式離開stack。

image

 

image

 

4.實際輸出結果,PerformanceLogging 先記log,因為後進先出。

image

 

結論
Spring.Net的Aop還是很聰明的,不過相對的,在設計Nested的Around advice,是該考量到順序會不會造成其他side effect。

 

 

 

 


或許您會對下列培訓課程感興趣:

  1. 2019/12/21(六)~2019/12/22(日):演化式設計:測試驅動開發與持續重構 第七梯次(台北)
  2. 2020/1/4(六)~2020/1/5(日):Clean Coder:DI 與 AOP 進階實戰 第三梯次(台北)
  3. 2020/02/08(六):【針對遺留代碼加入單元測試的藝術】 第八梯次(台北)
  4. 2020/02/09(日):【極速開發+】 第九梯次(台北)
  5. 2020/02/28(五)~2020/3/1(日) C#進階設計-從重構學會高易用性與高彈性API設計 第三梯次(台北)

想收到第一手公開培訓課程資訊,或想詢問企業內訓、顧問、教練、諮詢服務的,請洽 Facebook 粉絲專頁:91敏捷開發之路