[Spring.Net]AutoProxy設定,讓Aop更加彈性

[Spring.Net]AutoProxy設定,讓Aop更加彈性

前言
前面幾篇例子,有說明到怎麼在Spring的設定檔,加載Aop到我們的target class上,但當我們的object很多時,難道每一個object都要這樣子多增加一個Spring.Aop.Framework.ProxyFactoryObject來加載Aop模組嗎?那當我想要把整個系統的某一個Aop,甚至全部的Aop模組功能都取消時,設定檔不就幾乎要重寫了?(別忘了,Aop會作Dynamic Proxy,這中間的轉換是需要額外效能的)

這是很實際的需求,例如我們希望在測試階段,用Aop加載的performance monitor module,針對每一個object的Around advice都要記錄時間。當上線階段,我們希望performance monitor module全部移除。該怎麼作,才能讓我們設定Aop的部分享有彈性,且方便修改呢?

Spring.Net裡面有提供了AutoProxy的物件:Spring.Aop.Framework.AutoProxy.ObjectNameAutoProxyCreator
接下來我們來看怎麼作。

實作

  1. 當我們是使用手動設定每一個object的Aop時,如下圖所示:
    手動Aop設定
     
  2. 而當我們使用AutoProxy後,可以將中間的Spring.Aop.Framework.ProxyFactoryObject設定省略,而由Spring.Aop.Framework.AutoProxy.ObjectNameAutoProxyCreator來針對全域的object進行Aop的加載,如下圖所示:
    自動Aop設定
     

而AutoProxy的設定,該怎麼設定呢?請參考下圖:

autoProxy設定檔

 

 

只要將type設定成Spring.Aop.Framework.AutoProxy.ObjectNameAutoProxyCreator,而ObjectNames這個property,指的是當spring設定檔中的object id,符合*Service這個命名時,就會加載的Interceptors Aop模組,以這邊的例子就是加載beforeAdviceForUnitTestCase以及performanceLoggingAroundAdvice。

類似這樣的AutoProxyCreator,可以設定很多組,針對不同的ObjectNames pattern,去加載不同功用的interceptor。

另外一個最大的好處是,這個針對的是Object Names,也就是只針對設定檔上的object id,只要改設定檔,程式不用動,就可以決定有哪些object要加載或卸載Aop模組。

結論
一連串的Aop文章,希望可以幫助大家設計出真的有彈性、低耦合的系統架構出來。

 


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

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

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