基於.net簡單實現AOP
阿新 • • 發佈:2019-01-07
其中, MyRealProxy<T> 是個泛型型別,泛型引數 T 是要攔截的物件的型別,MyRealProxy<T> 建構函式需要一個實現泛型引數的真實物件作為引數。 7.OK了,到了這裡,基於透明代理(TransparentProxy)/真實代理(RealProxy)的實現方法攔截就告一段落了,接下來我們來用客戶端呼叫,來看看客戶端輸出的是什麼。為解決方法再新增一個控制檯應用程式(ConsoleApplication)。命名為AOPCalculatorClient,程式碼如下:using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Runtime.Remoting.Proxies; using System.Runtime.Remoting.Messaging; namespace NewAopCalculator { public class MyRealProxy<T>:RealProxy { private T _target; public MyRealProxy(T target) : base(typeof(T)) { this._target = target; } public override IMessage Invoke(IMessage msg) { IMethodCallMessage callmessage = (IMethodCallMessage)msg; //方法開始 PreProceede(callmessage); //呼叫真實方法 object returnValue = callmessage.MethodBase.Invoke(this._target, callmessage.Args); ReturnMessage message = new ReturnMessage(returnValue, new object[0], 0, null, callmessage); //方法呼叫完成 PostProceede(message); return message; } public void PreProceede(IMethodCallMessage msg) { //方法開始標識 Console.WriteLine("Start..."); //檢視呼叫的方法傳進來的引數 Console.WriteLine("Method:" + msg.MethodName.ToString()); for (int i = 0; i < msg.Args.Length; i++) { Console.WriteLine("{0}.The Args Is:{1}", i + 1, msg.Args[i]); } } public void PostProceede(ReturnMessage msg) { //方法結束標識 Console.WriteLine("End\n"); } } }