前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PostSharp 中 AOP 功能的简单使用

PostSharp 中 AOP 功能的简单使用

作者头像
独立观察员
发布2022-12-06 18:37:45
9060
发布2022-12-06 18:37:45
举报

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),其中有个构造函数和两个业务方法,完整代码如下:

代码语言:javascript
复制
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("测试抛出异常");
        }
    }
}

可以看到,我们在 AOP_PostSharp_Tester 类上添加了 AOP_PostSharp 特性,这样在该类中的每个方法执行过程中都会触发 AOP_PostSharp 类中的相关方法了。

接下来就是运行了,由于 PostSharp 从 2.0 开始要收费了,所以弹出了个选择许可证的窗口,同时编译出错了:

许可证窗口有三个选项,分别是使用社区版(有限制)、试用旗舰版(45 天)、添加许可证,这里我们选择第一个:

然后是同意许可条款:

接下来是选择感兴趣的领域,可以看到 PostSharp 功能很强大,并不止局限于 AOP,这里至少要选择一项:

按照我们代码的需求,应该只要选择第一个 Logging/tracing 就行了,为了保险起见,选择了 Diagnostics 类目下的全部三个:

这样之后就能顺利编译了,测试程序中就是调用了测试类的两个方法:

当把 AOP_PostSharp 特性放在类上时,从运行结果可以看出类中每个方法的执行过程都被记录了:

而如果只把 AOP_PostSharp 特性放在某个方法上时,则只有这个方法的执行过程被记录了:

由此可见 PostSharp 的 AOP 功能十分简单易用且强大,无需对业务类和方法做任何改动,只需加上个特性,就能达到记录信息的需求,可用于方法执行过程的监控、执行时间记录、异常记录等,大家可以自行探索,祝大家使用愉快。

最后,附上源码地址:https://gitee.com/dlgcy/MyAOPApplication

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-02-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 独立观察员博客 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档