1. 首页 > 快讯

聊一下Castle DynamicProxy基本用法(AOP)-51CTO.COM

[[408194]]

AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点……是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

动态代理是实现AOP的一种方式,即在开发过程中我们不需要处理切面中(日志等)的工作,而是在运行时,通过动态代理来自动完成。Castle DynamicProxy是一个实现动态代理的框架,被很多优秀的项目用来实现AOP编程,EF Core、Autofac等。

为业务类添加AOP拦截器

  1. ///  
  2.   /// 为业务类添加AOP拦截器。 
  3.   ///  
  4.   public class InterceptorAttribute:PlutoStudio.Aop.InterceptorAttribute 
  5.   { 
  6.       ///  
  7.       /// 拦截方法的执行,如果当前方法有拦截处理器,则执行处理器。 
  8.       ///  
  9.       /// name"invocation">被拦截的调用目标对象 
  10.       public override void Intercept(IInvocation invocation) 
  11.       { 
  12.           var method = invocation.Method; 
  13.           var processors = method.GetCustomAttributes(typeof(IInterceptorProcessor),true).Cast().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. ///  
  2.  /// 拦截器处理器接口。 
  3.  ///  
  4.  public interface IInterceptorProcessor 
  5.  { 
  6.      ///  
  7.      /// 拦截器处理方法,在目标方法执行前执行。 
  8.      ///  
  9.      /// name"invocation">拦截的目标对象 
  10.      void PreProcess(IInvocation invocation); 
  11.  
  12.      ///  
  13.      /// 拦截器处理方法,在目标方法执行后执行。 
  14.      ///  
  15.      /// name"invocation">拦截的目标对象 
  16.      /// name"ex">目标方法的异常 
  17.      void PostProcess(IInvocation invocation,Exception ex); 
  18.  } 

日志处理器

可以将目标方法的信息保存到日志系统中

  1. ///  
  2.   /// 日志处理器,可以将目标方法的信息保存到日志系统中。 
  3.   ///  
  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.       ///  
  11.       /// 在目标方法执行完成后执行,这里会记录目标方法的相关信息并写入日志系统。 
  12.       ///  
  13.       /// name"invocation"
  14.       /// name"ex"
  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(); 
  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. ///  
  2.   /// 系统跟踪日志,由"LogAttribute"/>生成。 
  3.   ///  
  4.   public class TraceLog 
  5.   { 
  6.       ///  
  7.       /// 当前日志记录的目标类。 
  8.       ///  
  9.       public string Class { get; internal set; } 
  10.       ///  
  11.       /// 当前日志跟踪到的异常。 
  12.       ///  
  13.       public Exception Exception { get; internal set; } 
  14.       ///  
  15.       /// 当前日志记录的目标方法。 
  16.       ///  
  17.       public string Method { get; internal set; } 
  18.       ///  
  19.       /// 当前日志记录的目标方法的参数。 
  20.       ///  
  21.       public Dictionary Parameter { get; internal set; } 
  22.       ///  
  23.       /// 当前日志记录的目标方法的返回值。 
  24.       ///  
  25.       public object ReturnValue { get; internal set; } 
  26.  
  27.       ///  
  28.       /// 当前日志记录的目标方法的调用栈。 
  29.       ///  
  30.       public IEnumerable Strack { get; internal set; } 
  31.   } 
  32.  

     

    关于聊一下Castle DynamicProxy基本用法(AOP)-51CTO.COM到此分享完毕,希望能帮助到您。

    用户评论

    疯人疯语疯人愿

    想了解一下动态代理这种技术,这个文章感觉很有帮助。

        有8位网友表示赞同!

    执念,爱

    看标题就觉得是讲一个很实用的框架,好想去看看怎么使用。

        有18位网友表示赞同!

    放血

    Castle DynamicProxy 这个名字听起来挺熟悉的,之前做过类似的项目好像用过?

        有8位网友表示赞同!

    熏染

    AOP 的原理一直都比较模糊,希望这篇文章能解释得更清楚点。

        有8位网友表示赞同!

    日久见人心

    51CTO 上的文章质量比较高,期待这篇介绍的详细内容。

        有7位网友表示赞同!

    我的黑色迷你裙

    学习一下Castle DynamicProxy 的用法,感觉可以提高开发效率。

        有9位网友表示赞同!

    ┲﹊怅惘。

    最近在想学习动态代理技术,这篇文章正好适合我。

        有19位网友表示赞同!

    残花为谁悲丶

    AOP 可以帮助我们做一些代码分离的工作,提升代码的可维护性吧?

        有9位网友表示赞同!

    龙卷风卷走爱情

    文章提到基本用法,是不是入门用得着呢?

        有12位网友表示赞同!

    玩味

    看看 Castle DynamicProxy 到底是怎么实现动态代理的。

        有10位网友表示赞同!

    笑叹★尘世美

    想了解一下这种技术在实际项目中的应用场景。

        有17位网友表示赞同!

    墨染殇雪

    感觉动态代理能解决很多重复代码的问题,提高开发效率。

        有13位网友表示赞同!

    青墨断笺み

    学习 AOP 的目的是为了写出更优雅、更简洁的代码吧?

        有6位网友表示赞同!

    黑夜漫长

    这个城堡玩意儿听着就高端大气上档次,我倒是想要了解一下。

        有14位网友表示赞同!

    闲肆

    希望这篇文章能介绍一些经典的案例,方便理解。

        有16位网友表示赞同!

    〆mè村姑

    动态代理这种技术听起来有点高深啊,希望能简单易懂地讲解。

        有5位网友表示赞同!

    神经兮兮°

    Castle 这个框架看起来很厉害的样子,希望能够深入了解一下它的用法。

        有7位网友表示赞同!

    灬一抹丶苍白

    看标题就感到很高兴,终于有人科普 DynamicProxy 了!

        有14位网友表示赞同!

    回忆未来

    AOP 这个概念应该会经常见到吧?还是想要好好学习一番。

        有11位网友表示赞同!

    本文采摘于网络,不代表本站立场,转载联系作者并注明出处:https://www.iotsj.com//kuaixun/7466.html

    联系我们

    在线咨询:点击这里给我发消息

    微信号:666666