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

news2024/9/25 3:24:16

简介(好久没写博客了)

万物皆可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,如有代码或者解释不当之处烦请指出。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/712971.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

上海市“小巨人”竞争力指数榜单发布!上海三思居全市总榜第四!分项NO.1!

6月25日下午,2022 年上海市专精特新“小巨人”市场竞争力指数榜单”在上海市上海联合产权交易所正式发布。上海三思电子工程有限公司多项荣登指数榜单: ●指数总榜TOP10,上海三思以83.69的高分位居全市8072家“小巨人”企业第四位&#xff0…

军用电子设备人工智能时代正在到来

源自: 战略前沿技术 Al的应用快速增长 更大的图景 人工智能技术的多面性 增强作战人员能力 数据依赖 人工智能和机器学习:前面的路 对人工智能应用保持警惕 声明:公众号转载的文章及图片出于非商业性的教育和科研目的供大家参考和探讨,并不意味着支持其观…

vue+elementui实现联想购物商城,样式美观大方

目录 一、首页效果图对比 1.联想商城首页截图: 2.作者项目效果图: 二、商品详情效果图对比 1.联想官方截图: 2.作者项目截图: 三、项目实现 1.数据分离维护 2.首页推荐列表数据处理 3.商品详情数据动态获取完成交互 4.商品详…

MySQL原理探索——20幻读

20 幻读是什么?幻读会造成什么后果? 在上一篇文章最后,遗留了一个关于加锁规则的问题。今天,我们就从这个问题说起。 为了便于说明问题,这篇文章,我们就先使用一个小一点的表。建表和初始化语句如下&#…

【MySQL】MySQL PHP 语法,PHP MySQL 简介,查询,下载 MySQL 数据库, SQL 教程

作者简介: 辭七七,目前大一,正在学习C/C,Java,Python等 作者主页: 七七的个人主页 文章收录专栏: 七七的闲谈 欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖&#x1f…

探究Vue源码:mustache模板引擎(4) 了解mustache转换概念,简述tokens转换

上文 探究Vue源码:mustache模板引擎(3) 通过编写简单正则了解mustache转换思路我们用正则表达式构建了一个简易版的render模板编译函数 但是 我们有特意强调过 mustache的render函数并非用简单正则实现的 因为这样无法实现循环和一些比较复杂的逻辑处理 它的实现基理可以参考这…

Ubuntu系统安装JDK教程

今天新买了一台阿里云服务器,因为centos 不提供了更新支持,所以Linux系统选择了Ubuntu 系统,今天就出一期 Ubuntu上安装的一系列教程,今天就先从JDK开始。 Ubuntu系统安装JDK教程 1、 jdk下载2、安装 lrzsz 命令 (仅限…

FreeRTOS_系统内核控制函数

目录 1. 系统内核控制函数预览 2. 系统内核函数详解 2.1 函数 taskYIELD() 2.2 函数 taskENTER_CRITICAL() 2.3 函数 taskEXIT_CRITICAL() 2.4 函数 taskENTER_CRITICAL_FROM_ISR() 2.5 函数 taskEXIT_CRITICAL_FROM_ISR() 2.6 函数 taskDISABLE_INTERRUPTS() 2.7 函数…

1. 数字mic驱动分析

一般遇到的音频硬件都是这样的 由于项目不需要播放只需要录音,于是将模拟的mic换成了数字mic,直接通过i2s连接到soc 由于还要使用alsa架构进行录音,所以这里不能简单的写个代码读i2s数据,需要虚拟出一个codec 上面就是我们这次要分…

第九十六天学习记录:Linux基础:实用操作Ⅰ

注:第一张图与学习记录无关,是为了参与CSDN的AI绘图活动 CtrlC强制停止 1、Linux某些程序的运行,如果想要强制停止它,可以使用快捷键CtrlC中止 2、在命令输入错误时,也可以通过快捷键CtrlC快速退出当前输入 CtrlD…

projection介绍及EPSG:4326和EPSG:3857的投射转换

每个地图数据在Web端加载显示时,都需要设罝其投影坐标系。众所周知,地图是不规则的椭球体,如果我们将其展开到二维平面上,会发现地图与实际情况有出入。所以,人们提出 投影的方式来尽量减小失真的程度。 openlayers的…

技术驱动美丽:动态贴纸与美颜SDK的应用实践与创新

随着科技的迅速发展,智能手机的普及以及社交媒体的兴起,人们对于美颜和创意贴纸的需求日益增长。动态贴纸和美颜技术的应用已经成为当今互联网时代的一种趋势。本文将重点讨论动态贴纸与美颜SDK的应用实践与创新,探讨它们对美容美妆行业和社交…

运维必学 | 变量定义调用-从零开始学Windows批处理(Batch)编程系列教程

欢迎关注「全栈工程师修炼指南」公众号 设为「星标⭐」每天带你 基础入门 到 进阶实践 再到 放弃学习! 专注 企业运维实践、网络安全、系统运维、应用开发、物联网实战、全栈文章 等知识分享 “ 花开堪折直须折,莫待无花空折枝。 ” 作者主页&#xff1…

vue中如何封装一个基础组件---demo

在 Vue 中封装基础组件可以提高代码的可复用性和维护性,使开发过程更高效。下面是封装基础组件的一般步骤: 确定组件功能:首先确定要封装的基础组件的功能和用途。基础组件通常是具有单一功能的,可以在不同的项目中多次使用的组件…

【C++初阶】C++入门——缺省参数、函数重载

目录 一、缺省参数1.1 定义1.2 缺省参数分类1.3 缺省参数只能出现在函数声明中 二、函数重载2.1 定义2.2 构成重载的几种情况2.3 C支持函数重载的原理 一、缺省参数 1.1 定义 缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实…

下一代Windows被披露,任何硬件都能运行

这么些年来,微软似乎一直没能打破 Windows 系统隔代香魔咒。 继 Win XP 惊艳世界后 Win Vista 表现平平,到 Win 7 引领一个时代; 接着 Win 8 含泪淹没在前代耀眼光环之下,直到 Win 10 再创辉煌成功走入家家户户。 而最新的 Win …

vue-antd-admin——关闭当前页面,跳转到指定页面——bus事件总线的用法

最近在写后台管理系统时,遇到一个需求: 关闭当前页面,然后跳转到指定页面。 具体实现方法如下: 1.tabsView.vue文件中添加bus文件,并实现跨组件之间的监听 1.1 引入bus文件 import Bus from /utils/bus; bus文件内…

C#winform自定义圆角按钮控件

本篇介绍自定义圆角渐变按钮,实现过程,实现效果如下 创建winform项目,添加组件类控件 修改的名称为ButtonEx,并点击添加 修改cs中的代码 using System; using System.ComponentModel;using System.Drawing; using System.Drawing.Drawing2D; using System.Windows.Forms;…

HKDF秘钥生成算法

HKDF叫HMAC-based KDF(key derivation function),基于HMAC的密钥推导函数,所以我们先认识HMAC算法。 1. HMAC 基于一个共同密钥,在两个对端之间提供消息完整性确认的机制叫"message authentication codes(MAC),消息认证码&…

【CSS】CSS使用变量与变量定义

如何定义可以在CSS中使用的变量 CSS变量(也称为自定义属性)的定义规则如下: 使用–作为前缀,后跟变量名。变量名可以由字母、数字、连字符和下划线组成,并且不能以连字符开头。变量名区分大小写。变量定义在选择器范…