實現DynamicProxy前,先介紹幾個必要的輔助類: 一、切麵上下文類AspectContext 該類是作為切麵特性類的OnEntry和OnEixt方法的參數用的,該類包含了被代理對象Sender、當前切入的方法名稱(Name)、調用方法的參數列表(Args)以及返回值(Result) 二、切麵 ...
實現DynamicProxy前,先介紹幾個必要的輔助類:
一、切麵上下文類AspectContext
該類是作為切麵特性類的OnEntry和OnEixt方法的參數用的,該類包含了被代理對象Sender、當前切入的方法名稱(Name)、調用方法的參數列表(Args)以及返回值(Result)
1 public class AspectContext 2 { 3 4 #region 構造函數 5 /// <summary> 6 /// 構造函數 7 /// </summary> 8 /// <param name="sender">被切入的對象</param> 9 /// <param name="name">切入方法名稱</param> 10 /// <param name="args">調用參數</param> 11 public AspectContext(object sender, string name, object[] args) 12 { 13 Sender = sender; Name = name; Args = args; Result = null; 14 } 15 #endregion 16 17 #region 屬性 18 19 /// <summary> 20 /// 被切入的對象 21 /// </summary> 22 public object Sender { get; set; } 23 24 /// <summary> 25 ///切入方法名稱 26 /// </summary> 27 public string Name { get; set; } 28 29 /// <summary> 30 /// 方法調用參數 31 /// </summary> 32 public object[] Args { get; set; } 33 34 /// <summary> 35 /// 返回值 36 /// </summary> 37 public object Result { get; set; } 38 39 #endregion 40 }
二、切麵特性基類 AspectAttribute
/// <summary> /// 切麵特性基類 /// </summary> [AttributeUsage(AttributeTargets.Class | AttributeTargets.Constructor | AttributeTargets.Method | AttributeTargets.Property)] public abstract class AspectAttribute : Attribute { public AspectAttribute() { IntercepType = XAOP.IntercepType.All; } public abstract InterceptType InterceptType { get; set; } public abstract void OnEntry(AspectContext context); public abstract void OnExit(AspectContext context); }
該類作為所有切麵特性的基類,包含攔截的類型、方法調用入口和方法調用出口。
三、攔截類型 InterceptType
/// <summary> /// 攔截類型 /// </summary> public enum InterceptType { #region 枚舉值 /// <summary> /// 入口 /// </summary> OnEntry = 1, /// <summary> /// 出口 /// </summary> OnExit = 2, /// <summary> /// 所有 /// </summary> All = 3 #endregion }
四、日誌特性類
該類簡單實現了方法調用前後的日誌記錄功能。
/// <summary> /// 日誌特性 /// </summary> public class LogAttribute : AspectAttribute { public override InterceptType InterceptType { get; set; } #region 開始調用 /// <summary> /// 開始調用 /// </summary> /// <param name="context"></param> public override void OnEntry(AspectContext context) { Console.Write("Log OnEntry:"); if (context != null && context.Args != null) Console.WriteLine("{0}({1})", context.Name, string.Join(",", context.Args)); } #endregion #region 調用結束 /// <summary> /// /// </summary> /// <param name="context"></param> public override void OnExit(AspectContext context) { Console.WriteLine("Log OnExit: " + context.Name + (context.Result != null ? " Result: " + context.Result.ToString() : "") + "\r\n"); } #endregion }