Castle AOP攔截與異常處理
實現AOP攔截
如上所述,Tiny Library CQRS利用了Apworks框架實現AOP攔截,那麼首先來了解一下Apworks支援AOP攔截的方式。Apworks採用Castle DynamicProxy實現AOP攔截,因此針對AOP攔截部分的開發,我們需要藉助Castle DynamicProxy框架。在此說明一下,雖然Apworks極力使用(,PoEAA)來降低核心模組對第三方元件的耦合度(這部分內容我會在《》系列文章中介紹),但與倉儲、訊息匯流排的實現相比,AOP更為核心,因此Apworks框架的核心模組直接依賴於Castle DynamicProxy。要基於Apworks實現AOP攔截,可以參考並遵循以下幾個步驟:
定義攔截器(Interceptor)
首先在你的專案中定義一個攔截器(Interceptor),使其實現Castle.DynamicProxy.IInterceptor介面,該介面位於Castle.Core.dll程式集中,是與Apworks一起釋出的。該介面只需要實現Intercept方法即可,在此方法中執行你自己的邏輯,然後使用invocation.Proceed方法將呼叫傳遞下去。需要注意的是,當invocation.Proceed發生異常的時候,如果被攔截的方法有返回值,那麼你需要捕獲異常並同時設定invocation.ReturnValue屬性,否則會從Castle.DynamicProxy
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
public class MyInterceptor
: IInterceptor
{
#region
IInterceptor Members
public void Intercept(IInvocation
invocation)
{
try
{
invocation.Proceed(); }
catch (Exception
ex)
{
invocation.ReturnValue
= xxx; //
Required!!
}
}
#endregion
}
|
Apworks框架在其Apworks.Interception名稱空間下提供了一個用於異常處理的內建攔截器,在後面我會介紹這個攔截器。
配置Apworks框架
為了使用自定義的攔截器,我們需要配置Apworks框架,具體表現就是在web.config或者app.config配置檔案中的apworks節點下,設定與AOP攔截相關的資訊。這些資訊包括:需要為哪些型別的哪些方法呼叫啟用AOP攔截?採用什麼攔截器去處理這些被攔截的方法?每個方法又支援哪些攔截器?比如,在Tiny Library CQRS中,AOP攔截的配置資訊如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
|