.NET下集中實現AOP編程的框架

1、Castle數組

使用這個框架呢,首先是須要安裝NuGet包。框架

先創建一個控制檯項目,而後在NuGet中搜索Castle.Windsor,不出意外的話應該能找到以下的包函數

而後安裝,會自動的安裝包Castle.Corepost

建立一個類CastleWindsor,實現接口IInterceptor,這個接口呢就在Castle.Core.dll中了spa

class CastleWindsor : IInterceptor
    {
        public void Intercept(IInvocation invocation)
        {
            PreProceed(invocation);
            Console.WriteLine("ffff");
            invocation.Proceed();
            PostProceed(invocation);

        }
        public void PreProceed(IInvocation invocation) { Console.WriteLine("方法執行前"); }
        public void PostProceed(IInvocation invocation) { Console.WriteLine("方法執行後"); }

    }

類中的Intercept函數來自於接口IInterceptor。而函數IInterceptor和PostProceed並非必須的,能夠沒有這兩個函數,主要仍是看Intercept函數中的invocation.Proceed();這一句。在這一句以前添加的代碼確定先於修飾的函數執行,在這以後的代碼,晚於3d

修飾的函數執行。code

而後定義服務端,就是完成業務功能的代碼段。對象

  public interface IUserProcessor {
        void RegUser(string txt);
        void WriteMessage(string msg);
    }
    public class UserProcessor : IUserProcessor {
        public virtual void RegUser(string txt) {
            Console.WriteLine("用戶已註冊。Name:{0}", txt);
        }

        public virtual void WriteMessage(string msg)
        {
            Console.WriteLine(msg);
        }
    }

假設的是這個接口和類就是爲了完成業務功能的地方。blog

而後建立客戶端來調用服務端:接口

 
 

class CoreBusiness
{

  public void Work_5()

 { try { Castle.DynamicProxy.ProxyGenerator generator = new Castle.DynamicProxy.ProxyGenerator(); CastleWindsor interceptor = new CastleWindsor(); IUserProcessor userprocessor = generator.CreateClassProxy<UserProcessor>(interceptor); userprocessor.WriteMessage("555555555555"); userprocessor.RegUser("123123123123"); } catch (Exception ex) { throw ex; } }
}

注意看這個客戶端的代碼,這裏有一個UserProcessor的對象userprocessor,可是卻沒有經過new關鍵字來建立,而是經過ProxyGenerator的CreateClassProxy函數來建立,從而將CastleWindsor類和UserProcessor類聯繫起來了。

在main函數中調用Work_5,執行結果:

從執行結果中能夠看出來,每次調用服務端的函數,都會執行Intercept函數。

這個框架來實現AOP的話,若是是項目開發中就應用了這個框架還好,不然在開發完成後纔來引入這個框架,那麼勢必要對原來的代碼進行大量的修改。這一點上還不如篩選器和postsharp框架。

 固然這個框架也能夠在函數執行前獲取函數的參數值,在函數執行後,能獲取函數的返回值。要注意的是,不能獲取到函數的參數名

 經過如下方式來獲取參數值和返回值

 

invocation.Method.Name:函數名

invocation.Arguments:參數值的數組。invocation.Arguments的類型是object[]

invocation.ReturnValue:函數返回值,注意這個必須是在invocation.Proceed()執行以後且函數有返回值的狀況下才有值。類型是object

看看Intercept函數的參數類型。注意標紅線的地方。ReturnValue不是隻讀的,那就是說能夠在函數執行完成後,去修改函數的返回值。SetArgumentValue表示能夠在函數執行前,去修改函數的參數。

 

相關文章
相關標籤/搜索