本文将介绍如何使用 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:
然后我们就可以新建一个 AOP 的功能类(AOP_PostSharp),继承 PostSharp.Aspects.OnMethodBoundaryAspect,OnMethodBoundaryAspect 类的功能就是能够在被应用的方法体前后插入代码片段,该类也是有一系列的继承关系,最终的基类为 C# 的特性类 Attribute,所以我们新建的类实际上也是一个特性类。
OnMethodBoundaryAspect 类有 OnEntry、OnException、OnExit、OnResume、OnSuccess、OnYield 等虚方法:
我们重写了其中的 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.........