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表示能夠在函數執行前,去修改函數的參數。