標籤:response 對象 透明代理 sed 技術 問題 override 構造器 creat
AOP思想是為了處理應用程式中摻雜的一些非問題域相關的程式碼片段,比如 日誌記錄,異常處理等一些跨問題域的通用程式碼片段。AOP的重點在於提供一種處理機制將應用程式分離成多個塊,主要是 問題域塊和通用處理方法塊。
AOP主要好處
一 .問題域處理不用一些無關處理代碼汙染。
二.通用處理代碼重用度高
實現方式
一.透明代理 remoting技術在core中不被支援。
原理:AOP實現的是對方法的攔截調用,方法本質上就是CLR堆棧上進行記憶體轉換,調用方通過方法表找到方法堆棧地址,按照參數格式把參數壓入堆棧,方法處理堆棧參數,重寫堆棧標識處理結果。
CLR提供了一種方法轉訊息的能力---透明代理;透明代理是由CLR建立的一種特別對象,它的存在只是為了將方法調用轉成訊息。System.Runtime.remoting 下定義了訊息處理的眾多介面。
透明代理對象非常特殊,不能繼承或者通過構造器建立透明代理對象,它和真實代理存在一一對應關係,只能通過真實代理的方法得到透明代理。
通過透明代理調用的方法,CLR會截獲並進行檢查,滿足跨域調用就會將方法堆棧轉換成訊息對象,並轉寄到真實代理對象上進行處理。
實現步驟: 1.定義真實代理
public class ExcetionProxy : RealProxy { /// <summary> /// 代理執行的真實對象 /// </summary> readonly MarshalByRefObject mtarget; public ExcetionProxy(MarshalByRefObject target, Type t) : base(t) { this.mtarget = target; } /// <summary> /// 方法訊息截獲 /// </summary> /// <param name="msg"></param> /// <returns></returns> public override IMessage Invoke(IMessage msg) { IMethodCallMessage call= (IMethodCallMessage)msg; Console.Write(" 方法執行之前"+ call.MethodName+"\n"); try { IMessage response = RemotingServices.ExecuteMessage(mtarget, call);//執行代理方法 return response; } catch (Exception ex) { throw; } finally { Console.Write(" Excetion Process Success"); } } }View Code
2. 代理的透明轉換
真實處理對象必須繼承 MarshalByRefObject,MarshalByRefObject作用是對對象打標籤,表示對象方法不能夠被CLR在編譯時間做最佳化處理.
public class MyExcObject : MarshalByRefObject { public static MyExcObject Create() { MyExcObject target = new MyExcObject(); ExcetionProxy rp = new ExcetionProxy(target, typeof(MyExcObject)); return (MyExcObject)rp.GetTransparentProxy(); } private MyExcObject() { } public Double Add(double x,double y) { return x + y; } }
C# aop