PostSharp AOP编程:5.PostSharp的MethodInterceptionAspect类基本组成

简介:

       在PostSharp中的MethodInterceptionAspect类是针对整个方法体的截取,继承于它的特性可以对整个方法体进行控制和日志截 取、异步操作等!这个类里面有一个主要的函数可以重载以实现包围整个方法体截取的作用,它是 OnInvoke(MethodInterceptionArgs args)。意义如下:

        OnInvoke(MethodInterceptionArgs args):在它的内部可以通过base.OnInvoke(args)来调用我们加特性声明的方法执行流程,通过这个方法我们可以在方法开始调用前做操作,调用之后做操作。

        首先我们编写一个继承于MethodInterceptionAspect类的特性,并且重载相关函数如下代码:

 

 
  1. [Serializable
  2. [AttributeUsage(AttributeTargets.Method, AllowMultiple = true, Inherited = true)] 
  3. class ExceptionLogAttribute:MethodInterceptionAspect 
  4.     //针对整个方法体进行包围调用添加日志和截取异常 
  5.     public override void  OnInvoke(MethodInterceptionArgs args) 
  6.     { 
  7.         Arguments arguments = args.Arguments;       
  8.         StringBuilder sb = new StringBuilder(); 
  9.         ParameterInfo[] parameters = args.Method.GetParameters();  
  10.         for (int i = 0; arguments != null && i < arguments.Count; i++)     
  11.         {             
  12.             //进入的参数的值         
  13.             sb.Append( parameters[i].Name + "=" + arguments[i] + "");   
  14.         } 
  15.  
  16.         try 
  17.         { 
  18.             Console.WriteLine("进入{0}函数,参数是:{1}", args.Method.DeclaringType + args.Method.Name, sb.ToString()); 
  19.              base.OnInvoke(args); 
  20.             Console.WriteLine("退出{0}函数,返回结果是:{1}",args.Method.DeclaringType+args.Method.Name,args.ReturnValue); 
  21.         } 
  22.         catch(Exception ex) 
  23.         { 
  24.             Console.WriteLine(string.Format("出现异常,此方法异常信息是:{0}", ex.ToString())); 
  25.         } 
  26.     } 

        其次我们写两个方法做对比,一个方法会发生异常,另外一个方法不会发生异常,并为其添加ExceptionLog的特性,在客户端进行调用对比,如以下代码所示:

 

 
  1. class Program 
  2.     static void Main(string[] args) 
  3.     { 
  4.         SetData("First"); 
  5.         Console.WriteLine("---------------------------------------------------------------------------"); 
  6.         GetData("Second"); 
  7.         Console.ReadLine(); 
  8.     } 
  9.  
  10.     [ExceptionLog] 
  11.     public static string SetData(string str) 
  12.     { 
  13.  
  14.         return "已经设置数据"
  15.     } 
  16.  
  17.     [ExceptionLog] 
  18.     public static string GetData(string str) 
  19.     { 
  20.  
  21.         throw new ArgumentException("获取数据出现异常,需要处理"); 
  22.         return "已经获取数据"
  23.     } 

        如需源码请点击 PostSharpMethodInterceptionAspect.zip 下载,运行效果如下图:


 


本文转自程兴亮 51CTO博客,原文链接:http://blog.51cto.com/chengxingliang/827102


相关文章
|
4月前
|
SQL 缓存 Java
【Spring】AOP底层原理(动态代理)-》 AOP概念及术语 -》 AOP实现
【Spring】AOP底层原理(动态代理)-》 AOP概念及术语 -》 AOP实现
28 0
|
7月前
|
Java Spring
Spring框架AOP静态代理
一、什么是AOP面向切面编程? AOP(Aspect-Oriented Programming,面向切面编程)是一种编程范式,旨在通过将横切关注点(如日志记录、事务管理等)从主业务逻辑中分离出来,提高代码的模块化和可维护性。 二、什么是静态代理? 静态代理是在编译时就已经确定了被代理对象和代理对象的关系,代理对象在运行时不会发生改变。通过静态代理,可以在调用被代理对象的方法之前或之后执行额外的逻辑,实现功能的增强或控制。
42 2
|
设计模式 缓存 安全
Spring框架学习(五) 面向切面编程 AOP
Spring框架学习(五) 面向切面编程 AOP
126 0
Spring框架学习(五) 面向切面编程 AOP
解释一下什么叫AOP(面向切面编程)?
AOP(Aspect-Oriented Programming)指一种程序设计范型,该范型以一种称为切面(aspect)的语言构造为基础,切面是一种新的模块化机制,用来描述分散在对象、类或方法中的横切关注点(crosscutting concern)。
2088 0
|
存储 缓存 数据库