AOP編程在目前來說好像是大家都比較喜歡的。ASP.NET MVC中的Filter就是使用AOP實現的配置器模式。AOP在編碼中的應用主要有如下幾個方面:
日志記錄,跟蹤,優化和監控
事務的處理
持久化
性能的優化
資源池,如數據庫連接池的管理
系統統一的認證、權限管理等
應用系統的異常捕捉及處理
針對具體行業應用的橫切行為
前面幾種應用我相信大家都是比較熟悉的。在ASP.NET MVC中有Filter之類的,提供認證和權限管理。很多實現AOP的組件都是拿日志作為例子說明。我這里給大家說明一個具體業務的橫切例子。
以之前的Orchard.Car模塊為例,如果我們這個模塊式產品中的一個模塊,當應用到項目中時,可能需要一些改動,那么AOP就可以在很多時候解決我們的問題。
假設我們現在有一個方法是獲取Car的列表,那么對應的代碼如下:
對應的Service代碼如下:
別忘了在Route.cs中添加路由代碼。
運行,查看結果:
如果在產品發布后,項目A中使用該產品,需要為car添加一個字段,叫做縮略圖,那么很現實的一個問題是,我們是不是為了項目A單獨為car擴展一個字段?這時候適配器就很重要了,實現適配器的方式有很多,我們這里就說明下如何使用AOP來實現字段的擴展。
首先需要一個Aufofac的module類,代碼如下:
我們只需要為CarInfoService類來添加一個攔截器,別的就沒有必要了。這里你會看到有一個SimpleInterceptor類,它的作用就是用來對CarInfoService的方法進行攔截。
SimpleInterceptor的代碼如下:
如果當前的方法名稱是GetList那么我們就為它添加一個字段,代表縮略圖。這里我隨便寫一個,你可以根據自己的實際需要去做相應的改變。
現實中,可能這個Interceptor是在一個擴展模塊中,所以對應的需要一個擴展的服務來提供Thumb字段。
結果不正確,因為我們客戶端或者頁面已經對運來的JSON進行了解析,所以新的JSON格式不是我們需要的,再次修改Interceptor的代碼:
除了GetList方法可以通過AOP實現修改封閉擴展開放,你葉可以使用這種方式來擴展新增記錄的方法。這時你需要把Request.Form從Controller中傳入Service方法。這種擴展方式一個很大的好處就是可以幫助多個項目平穩的升級。產品模塊的代碼永遠都不會被項目牽制。
具體的例子請到github上下載相應的代碼來查看,這里就不做解釋了。
上面只是我自己的一個小小的使用經驗,有時候當字段的類型需要更改,而你不允許直接更改當前的代碼時,這種方式也是一個不錯的方法。
AOP雖然不是標准的設計模式之一,但是通過它可以讓很多的模式更加簡單的實現。
最后說明一下,OrchardNoCMS中如何實現的AOP。
它使用的Castle.DynamicProxy來實現的。結合Autofac。首先是對AutoFac的擴展類:
注入時,需要為注入的Component調用EnableDynamicProxy方法,代碼位置:
可以看出來,所有實現繼承了IDependency的類都可以使用AOP。
以上就是OrchardNoCMS的AOP編程示例,可以到https://github.com/nicholaspei/OrchardNoCMS 下載完整代碼。