September 7, 2013

書評 - AOP in .NET: Practical Aspect-Oriented Programming

圖片來源:天瓏網路書店
Aspect-Oriented Programming (AOP)這名詞我大概是在兩三年前看過幾篇介紹文章知道的,但再更早之前AOP就已被提出來了。AOP主要是用來解決撰寫Cross-Cutting Concern時會遇到code duplication及混淆business logic等問題,如Logging、Caching、Validation等。在Java領域中,很早就有專書講解AOP在Java上的應用,而在.NET領域中雖然介紹文章不算少,尤其是隨著ASP.NET MVC的熱門,AOP在.NET的應用更為關注,但專門討論AOP的書這本應該算是第一本,而在它出版前我也注意它有一段時間。

本書除了介紹AOP的專有名詞及概念外,直接以兩套知名的.NET AOP Framework做為範例來介紹在.NET中如何實作AOP。這兩套Framework分別是Castle DynamicProxyPostSharp。這兩套的差別在於DynamicProxy是在run-time透過Proxy物件執行AOP,且DynamicProxy主要是和IoC container搭配實作;而PostSharp是在compile-time時由framework做IL weaving將Advice插入原始程式中。DynamicProxy是免費開源的,而PostSharp有分免費版和付費版。此外,這本書只有近300頁,搭配程式碼範例讀起很輕鬆也容易吸收。

我在最近的一個Windows Form專案中也參考了這本書使用PostSharp加入AOP的設計,讓Cross-Cutting Concern和Business Logic分離,程式碼精簡不少,Business Logic也乾淨了許多。如果有朋友想了解AOP,我相當推薦這本書做為參考。

2 comments:

陳家豪 said...

可以說說為什麼選擇了 PostSharp 嗎?

Pete Chen said...

主要是這本書對PostSharp的解說不少也不錯,再來是PostSharp是以Attribute-based的方式來設定Cross-Cutting Concern相較於DynamicProxy需從IoC Container的支援設計AOP,PostSharp是彈性許多,可以設定在某一個Assembly、Class,或是單一一個Method,也可針對特定Method做排除。若使用DynamicProxy就得先了解所使用的IoC Framework如何與DynamicProxy做整合。

另外一點讓我猶豫沒使用DynamicProxy的是,我找不到方法可以針對private method做AOP,這讓我在實作AOP Logging時沒辦法完整記錄使用者的操作過程,或許有方式可以做到,但目前我還沒找到。