[小菜一碟] Autofac.Extras.DynamicProxy 中 EnableInterfaceInterceptors() 及 EnableClassInterceptors() 的區別

在設計中加入 AOP 著實會讓程式碼清晰度大增,讓程式的職責更清楚,Autofac 中的擴充套件 Autofac.Extras.DynamicProxy 可以輕鬆地讓我們實現 AOP 的功能,在註冊完後可以呼叫 EnableInterfaceInterceptors()EnableClassInterceptors() 的其中一個方法來啟用 Interceptors,而這兩個擴充方法的區別又在哪?

EnableInterfaceInterceptors()

範例程式碼裡面有一隻燕子跟鴕鳥,牠們都實作 IFlying 介面都會飛(鴕鳥會飛?!)。

燕子跟鴕烏在飛的時候要戴上安全帽,因此我實作了一個 HelmetInterceptor 掛在 IFlying 之上,讓燕子跟鴕鳥在飛的時候都戴上安全帽。

接著在 Autofac 的註冊程序中在加上 EnableInterfaceInterceptors(),燕子跟鴕鳥在飛的時候就會戴上安全帽了。

來看一下牠們飛的樣子

使用 EnableInterfaceInterceptors() 來啟用 Interceptors,被攔截的對象必須有實作的介面,讓 Autofac.Extras.DynamicProxy 建立被攔截對象的代理來改變執行的行為。

EnableInterfaceInterceptors() 同場加映

Interceptors 不一定要掛在實作的介面上,掛在被攔截的對象上也可以,假設鴕鳥在飛的時候,不只要戴上安全帽還要戴上 VR 眼鏡,所以我做了一個 VirtualRealityInterceptor 來讓鴕鳥使用。

這下子鴕鳥除了安全帽,VR 眼鏡也戴上了。

EnableClassInterceptors()

如果被攔截的對象沒有實作某個介面怎麼辦?為了要讓 Autofac.Extras.DynamicProxy 可以建立被攔截對象的代理,想要改變行為的方法必須是 public virtual,我們來看一下範例。

我加了一隻狗,這隻狗在出門散步的時候也要戴上安全帽,我們就把出門散步的方法宣告成 public virtual,並且把 HelmetInterceptor 掛到 Dog 上。

再來,在 Autofac 的註冊程序裡面把 Dog 註冊進去,並且執行 EnableClassInterceptors()。

狗出門散步也戴上安全帽了

參考資料

 < Source Code >

相關資源

C# 指南
ASP.NET 教學
ASP.NET MVC 指引
Azure SQL Database 教學
SQL Server 教學
Xamarin.Forms 教學