2014年8月21日 星期四

以AOP實作Log機制

      使用過Asp.Net MVC架構開發網站,若有使用到Filter,一定會為其神奇的機制及簡潔的程式寫法感到相當震撼。(至少小弟我是啦…),在Action前加上Attribute就可以外掛一大堆流程的處理,例如假設在每一個Action執行前都需要解析Cookie內容,以得到購物車內容…等資訊。那ActionFilter就一條非常好的路。這樣的方式其實就是一種AOP的實作。

      關於什麼是AOP(aspect-oriented programming),我想還是參考專業的91哥解釋比較恰當…
      但如果…客戶不允許你用MVC勒…(在下最痛恨這種情況發生…),那只好自己來…接下來的範例,會呈現一個搭配NLog並以AOP實作Function Log的小程式。原由是在下公司有些歷史包袱…很多程式運作沒人懂…所以希望藉由Function被呼叫的歷程記錄搭配畫面與程式碼來幫助工程師們理解流程。
Step1, 建立自訂的屬性(Attribute) 類別(For Class & For Method)
For Class, 建立了一個AopLoggerAttribute, 需繼承ContextAttribute並實作IContributeObjectSink介面
image
For Method, 建立了一個AopLoggerMethodAttribute, 需繼承Attribute
image
建立完後,編譯一定不會過,因為還沒建立AopLoggerHandler…
Step2, 建立AopLoggerHandler
僅列出其主要的程式片段,完整程式碼請由此下載
在此片段中,共有四大步驟
- 執行原方法前,寫一行Log
- 執行原方法
- 若執行原方法時發生Exception,則寫一行Log
- 方法執行結束,寫一行Log
image

Step3, 將需要追蹤的類別
- 繼承ContextBoundObject
- 在類別上加入AopLoggerAttribute
- 於Method上加入AopLoggerMethodAttribute。
image
呼叫DoSomething方法就會得到以下Log
image
呼叫DoSomethingException方法就會得到以下Log
image
後記: 個人暫時還無法想到如何解決,若要追蹤Form.cs內的Function該怎麼辦…因為要被追蹤的類別要繼承ContextBoundObject,但WinForm程式Form.cs又必需繼承Form…若有前輩先進們有解決方法,也請不吝分享,謝謝。
完整範例下載

沒有留言:

張貼留言