国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - 編程技術 - 聊一下Castle DynamicProxy基本用法(AOP)

聊一下Castle DynamicProxy基本用法(AOP)

2021-06-30 02:13UP技術控conan5566 編程技術

AOP為Aspect Oriented Programming的縮寫,意為:面向切面編程,通過預編譯方式和運行期動態代理實現程序功能的統一維護的一種技術。

聊一下Castle DynamicProxy基本用法(AOP)

AOP為Aspect Oriented Programming的縮寫,意為:面向切面編程,通過預編譯方式和運行期動態代理實現程序功能的統一維護的一種技術。AOP是OOP的延續,是軟件開發中的一個熱點……是函數式編程的一種衍生范型。利用AOP可以對業務邏輯的各個部分進行隔離,從而使得業務邏輯各部分之間的耦合度降低,提高程序的可重用性,同時提高了開發的效率。

動態代理是實現AOP的一種方式,即在開發過程中我們不需要處理切面中(日志等)的工作,而是在運行時,通過動態代理來自動完成。Castle DynamicProxy是一個實現動態代理的框架,被很多優秀的項目用來實現AOP編程,EF Core、Autofac等。

為業務類添加AOP攔截器

 

  1. /// <summary> 
  2.   /// 為業務類添加AOP攔截器。 
  3.   /// </summary> 
  4.   public class InterceptorAttribute:PlutoStudio.Aop.InterceptorAttribute 
  5.   { 
  6.       /// <summary> 
  7.       /// 攔截方法的執行,如果當前方法有攔截處理器,則執行處理器。 
  8.       /// </summary> 
  9.       /// <param name="invocation">被攔截的調用目標對象</param> 
  10.       public override void Intercept(IInvocation invocation) 
  11.       { 
  12.           var method = invocation.Method; 
  13.           var processors = method.GetCustomAttributes(typeof(IInterceptorProcessor),true).Cast<IInterceptorProcessor>().ToList(); 
  14.           processors.ForEach(p => PlutoStudio.MefContainer.Container.ComposeParts(p)); 
  15.           if (processors.Count>0) 
  16.           { 
  17.               processors.ForEach(p => p.PreProcess(invocation)); 
  18.               try 
  19.               { 
  20.                   invocation.Proceed(); 
  21.                   processors.ForEach(p => p.PostProcess(invocation, null)); 
  22.               } 
  23.               catch (Exception ex) 
  24.               { 
  25.                   processors.ForEach(p => p.PostProcess(invocation, ex)); 
  26.                   throw; 
  27.               } 
  28.           } 
  29.           else 
  30.           { 
  31.               invocation.Proceed(); 
  32.           } 
  33.       } 
  34.   } 
  1. /// <summary> 
  2.  /// 攔截器處理器接口。 
  3.  /// </summary> 
  4.  public interface IInterceptorProcessor 
  5.  { 
  6.      /// <summary> 
  7.      /// 攔截器處理方法,在目標方法執行前執行。 
  8.      /// </summary> 
  9.      /// <param name="invocation">攔截的目標對象</param> 
  10.      void PreProcess(IInvocation invocation); 
  11.  
  12.      /// <summary> 
  13.      /// 攔截器處理方法,在目標方法執行后執行。 
  14.      /// </summary> 
  15.      /// <param name="invocation">攔截的目標對象</param> 
  16.      /// <param name="ex">目標方法的異常</param> 
  17.      void PostProcess(IInvocation invocation,Exception ex); 
  18.  } 

日志處理器

 

可以將目標方法的信息保存到日志系統中

  1. /// <summary> 
  2.   /// 日志處理器,可以將目標方法的信息保存到日志系統中。 
  3.   /// </summary> 
  4.   [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)] 
  5.   public class LogAttribute : Attribute, IInterceptorProcessor 
  6.   { 
  7.       [Import(AllowDefault = true)] 
  8.       public ILog Log { get; set; } 
  9.  
  10.       /// <summary> 
  11.       /// 在目標方法執行完成后執行,這里會記錄目標方法的相關信息并寫入日志系統。 
  12.       /// </summary> 
  13.       /// <param name="invocation"></param> 
  14.       /// <param name="ex"></param> 
  15.       public void PostProcess(IInvocation invocation, Exception ex) 
  16.       { 
  17.           if (Log != null
  18.           { 
  19.               var @class = invocation.TargetType.FullName; 
  20.               var method = invocation.Method.Name
  21.               var parameterNames = invocation.Method.GetParameters().Select(p => p.Name).ToList(); 
  22.               var args = invocation.Arguments; 
  23.               var parameters = new Dictionary<string, object>(); 
  24.               for (int i = 0; i < parameterNames.Count; i++) 
  25.               { 
  26.                   parameters.Add(parameterNames[i], args[i]); 
  27.               } 
  28.               var returnValue = invocation.ReturnValue; 
  29.               var stackTrace = new StackTrace(true); 
  30.               var stacks = stackTrace.GetFrames(); 
  31.               var stack = stacks.SkipWhile(i => i.GetMethod().Name != invocation.Method.Name).Select(GetStack); 
  32.               var log = new TraceLog 
  33.               { 
  34.                   Class = @class, 
  35.                   Method = method, 
  36.                   Parameter = parameters, 
  37.                   ReturnValue = returnValue, 
  38.                   Strack = stack, 
  39.                   Exception = ex, 
  40.               }; 
  41.               Log.Custom(log); 
  42.  
  43.           } 
  44.       } 
  45.  
  46.       private object GetStack(StackFrame frame) 
  47.       { 
  48.           var method = frame.GetMethod(); 
  49.           var type = method.ReflectedType; 
  50.           if (type.FullName.StartsWith("Castle.Proxies")) 
  51.           { 
  52.               type = type.BaseType; 
  53.           } 
  54.           return new 
  55.           { 
  56.               Method = method.Name
  57.               Type = type.FullName, 
  58.               File = frame.GetFileName(), 
  59.               Line = frame.GetFileLineNumber(), 
  60.           }; 
  61.       } 
  62.  
  63.       public void PreProcess(IInvocation invocation) 
  64.       { 
  65.       } 
  66.   } 
  1. /// <summary> 
  2.   /// 系統跟蹤日志,由<see cref="LogAttribute"/>生成。 
  3.   /// </summary> 
  4.   public class TraceLog 
  5.   { 
  6.       /// <summary> 
  7.       /// 當前日志記錄的目標類。 
  8.       /// </summary> 
  9.       public string Class { get; internal set; } 
  10.       /// <summary> 
  11.       /// 當前日志跟蹤到的異常。 
  12.       /// </summary> 
  13.       public Exception Exception { get; internal set; } 
  14.       /// <summary> 
  15.       /// 當前日志記錄的目標方法。 
  16.       /// </summary> 
  17.       public string Method { get; internal set; } 
  18.       /// <summary> 
  19.       /// 當前日志記錄的目標方法的參數。 
  20.       /// </summary> 
  21.       public Dictionary<string, object> Parameter { get; internal set; } 
  22.       /// <summary> 
  23.       /// 當前日志記錄的目標方法的返回值。 
  24.       /// </summary> 
  25.       public object ReturnValue { get; internal set; } 
  26.  
  27.       /// <summary> 
  28.       /// 當前日志記錄的目標方法的調用棧。 
  29.       /// </summary> 
  30.       public IEnumerable<object> Strack { get; internal set; } 
  31.   } 

原文鏈接:https://mp.weixin.qq.com/s/CgnC5D4qeBKSsrqzMV4p-w

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 日韩精品一区不卡 | 九九在线视频 | 一区二区三区精品视频 | 少妇一区二区三区免费观看 | 欧美精品久久久 | 国产精品二区一区二区aⅴ污介绍 | 日本免费高清视频 | 国产精品久久国产精品 | 精品国产乱码久久久久久密桃99 | 在线观看免费成人av | 国产a区 | 午夜婷婷丁香 | 中国大陆高清aⅴ毛片 | 亚洲淫视频 | av一级久久| 日本欧美在线 | 97久久精品人人澡人人爽 | 中文字幕一区在线 | 99视频精品在线 | 免费看黄色一级大片 | 色综久久| 久久99这里只有精品 | 龙珠z国语版291集全 | 欧美a级网站 | 高清国产一区 | 黄色国产视频 | 久久人人爽爽爽人久久久 | 国产精品中文字幕在线 | 午夜免费电影 | 亚洲精品成人在线 | 在线一区观看 | 国产成人精品久久二区二区 | 日韩欧在线 | 国产精品久久 | 狠狠草视频 | 在线婷婷| 在线免费黄| 日日操天天操 | 日本免费在线一区 | 国产激情视频 | 中文字幕在线资源 |