.Net之AOP - 使用Fody的代码静态编织实现AOP

简介(好久没写博客了)

万物皆可AOP,本篇文章主要讲解在.Net7中使用Fody的代码静态编织实现AOP。

一、前言

AOP

AOP是指面向切面编程 (Aspect Oriented Programming),相信大家都再熟悉不过了,实现AOP的方式也有很多种,不管是.Net Framework还是.Net Core的过滤器,还是.Net Core中独有的管道中间件,还有第三方,例如Castle,Unity,PostSharp等等,除开PostSharp,其他两个Castle,Unity实现AOP使用的都是动态代理,即在运行时对给代码生成代理方法,然后执行,PostSharp是使用的代码静态编织,即在编译时就对IL代码进行修改,但是他已经收费。

Rougamo.Fody(肉夹馍)

今天的主角,Rougamo.Fody,读着像是“肉夹馍”,也是使用代码静态编织技术,实现AOP。

Rougamo.Fody对代码静态编织的原理和时机:

Created with Raphaël 2.3.0 C#/.Net代码 生成项目 编译成IL代码(Fody的IL Weaver进行代码编织) JIT编译 机器码Native Code

二、使用

1、创建.Net7 WebApi项目

2、安装Rougamo.Fody

a、Nuget:搜索Rougamo.Fody
b、命令安装:

install-package Rougamo.Fody
dotnet add package Rougamo.Fody

在这里插入图片描述

3、编写特性(拦截器)

在特性中继承MoAttribute,根据需要通过重写里面的四个方法,完成自定义AOP拦截:

OnEntry:执行方法前执行
OnSuccess:执行方法成功后执行
OnException:执行方法异常时执行
OnExit:执行方法结束时执行,无论成功还是异常,都会执行

每个方法参数MethodContext context都是当前拦截的方法上下文,主要用到的有:

context.Method:拦截的方法对象
context.TargetType:拦截的方法的所属类型
context.Arguments:上端传递过来的参数,是个object数组,可以根据需求修改参数值
context.RewriteArguments = true:重写参数,如果没有该行代码,自定义处理的参数不会生效
context.ReturnValue:方法的返回值
context.ReplaceReturnValue(this, 自定义返回值):可以修改方法的返回值
context.RealReturnType:方法的返回值类型
context.Exception:方法执行过程中产生的异常
context.HandledException(this,自定义返回值):说明已经处理完毕异常,且给了自定义的返回值

4、使用拦截器(告诉Fody需要拦截哪些东西)

在需要拦截的类/方法上标记特性(拦截器),进行AOP拦截,有两种标记方式:

a、在类/方法上标记特性

在这里插入图片描述
在这里插入图片描述

b、实现接口完成标记

在这里插入图片描述

5、自定义拦截

被标记的类,或者实现的接口,默认只会拦截该类下的public的实例方法,如果想要拦截其他方法,例如静态方法,私有方法等等…,可以使用如下方式实现:

a、在拦截特性中重写特性的标识

在这里插入图片描述

b、在需要拦截的方法上单独加特性

在这里插入图片描述

6、生成项目,通过查看IL代码,看Fody的静态编织结果

OnEntry:执行方法前执行

在这里插入图片描述

OnException:执行方法异常时执行

Fody把我们的代码包在了try里面,在catch到异常时,触发OnException
在这里插入图片描述
在这里插入图片描述

OnSuccess:执行方法成功后执行

在这里插入图片描述

OnExit:执行方法结束时执行,无论成功还是异常,都会执行

在这里插入图片描述

7、我写了三个拦截器:

ArgumentAttribute:拦截到参数,进行修改修改,以及规范化返回值;
LoggingAttribute:记录日志;
OrderAttribute:拦截返回值,自动填充订单Id,生成订单号,填充下单时间;

运行起来看效果:

请求参数:

在这里插入图片描述

响应:

在这里插入图片描述

控制台输出:

在这里插入图片描述

三、结语

通过使用可以发现,Fody可以在任何.Net项目中使用,可以很方便的进行方法拦截和切面控制,这也是AOP的思想,可以做到对业务少量入侵甚至零入侵,进行统一的维护和控制,例如日志,身份认证,授权,缓存,链路跟踪,熔断,降级,状态上报等等,极大的提升程序的可扩展性;

Ending,如有代码或者解释不当之处烦请指出。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值