PostSharp 中 AOP 功能的简单使用

本文将介绍如何使用 PostSharp 中的 AOP 功能,实现在不修改原业务方法的情况下,记录方法运行的额外信息。

PostSharp 中 AOP 功能的简单使用

独立观察员 2021 年 2 月 21 日

年前在研究 .NET 中如何实现 AOP(Aspect-Oriented Programming,面向切面的编程)时看到了一篇叫做《C# 进阶系列 ——AOP?AOP!》的文章,作者在文章中介绍了静态拦截(装饰器模式)、动态代理(使用微软企业库)、IL 编织(使用 PostSharp)三种方式;而在作者提供的源码中,则是提供了前两者以及另外一种动态代理(使用 .Net Remoting / RealProxy)共三种方式;本人在原代码的基础上,改控制台测试程序为 Winform 测试程序,并补充上 PostSharp 的演示代码。

本文将介绍如何使用 PostSharp 中的 AOP 功能,实现在不修改原业务方法的情况下,记录方法运行的额外信息。

首先使用 NuGet 安装 PostSharp:

PostSharp 中 AOP 功能的简单使用插图

然后我们就可以新建一个 AOP 的功能类(AOP_PostSharp),继承 PostSharp.Aspects.OnMethodBoundaryAspect,OnMethodBoundaryAspect 类的功能就是能够在被应用的方法体前后插入代码片段,该类也是有一系列的继承关系,最终的基类为 C# 的特性类 Attribute,所以我们新建的类实际上也是一个特性类。

PostSharp 中 AOP 功能的简单使用插图1

OnMethodBoundaryAspect 类有 OnEntry、OnException、OnExit、OnResume、OnSuccess、OnYield 等虚方法:

PostSharp 中 AOP 功能的简单使用插图2

我们重写了其中的 OnEntry、OnExit、OnException 三个方法,分别在方法执行前、执行后、发生异常时执行,我们这里就是记录了一下执行情况。

然后再加一个业务类,当作测试类(AOP_PostSharp_Tester),其中有个构造函数和两个业务方法,完整代码如下:

using PostSharp.Aspects;using System;namespace MyAOPApplication{ /// <summary> /// AOP 功能类 /// </summary> [Serializable] public class AOP_PostSharp : PostSharp.Aspects.OnMethodBoundaryAspect {  //发生异常时进入此方法  public override void OnException(MethodExecutionArgs args)  {   base.OnException(args);   Console.WriteLine($"发生异常了:{args.Exception}");  }  //执行方法前执行此方法  public override void OnEntry(MethodExecutionArgs args)  {   base.OnEntry(args);   Console.WriteLine($"即将执行方法 {args.Method}");  }  //执行方法后执行此方法  public override void OnExit(MethodExecutionArgs args)  {   base.OnExit(args);   Console.WriteLine($"方法执行结束 {args.Method}");  } } /// <summary> /// AOP 测试类(业务类) /// </summary> [AOP_PostSharp] public class AOP_PostSharp_Tester {  public AOP_PostSharp_Tester()  {   Console.WriteLine("构造函数");  }  //[AOP_PostSharp]  public void Method1()  {   Console.WriteLine("方法一");  }  public void Method2()  {   Console.WriteLine("方法二");   throw new Exception("测试抛出异常");  } }}

&nbs.........

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )

AOP相关概念

1.AOP(面向切面编程)在软件业,AOP为AspectOrientedProgramming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,在软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生泛型.利用AOP