(系列七).net8 Aop切面编程

news/2024/10/22 21:26:02

说明

    该文章是属于OverallAuth2.0系列文章,每周更新一篇该系列文章(从0到1完成系统开发)。

    该系统文章,我会尽量说的非常详细,做到不管新手、老手都能看懂。

    说明:OverallAuth2.0 是一个简单、易懂、功能强大的权限+可视化流程管理系统。

友情提醒:本篇文章是属于系列文章,看该文章前,建议先看之前文章,可以更好理解项目结构。

有兴趣的朋友,请关注我吧(*^▽^*)。

关注我,学不会你来打我

什么是Aop切面编程

俗话说:没有使用Aop的系统都不是好系统。  

那么aop到底是什么东西,人们对它的评价如此之高。

Aop是Aspect Oriented Programming的缩写,意思是“面向切面编程”。

从字面意思上理解就是把一个功能块切成很多面。

列如:

我有10个获取数据的接口,随着代码的不断迭代,现如今想做以下2个操作。

1、现在对这10个接口做一个【性能监控】,监控这10个接口的调用时间。你会怎么做?

2、对这10个接口做一个【调用监控】,查看调用人、调用时间、传入参数、返回数据等记录。你会怎么做?

有人说,在每个接口中加一点监控代码。

也有人说,写一个监控方法,在接口中调用该方法。

但这都不是好的选择,它不仅工作量大、耦合性高,还容易造成错误,不易维护。

为了解决这种困难,aop诞生了。它在不修改接口原有逻辑的情况下,把接口切分为多个逻辑单元。

它很好的降低了这方面的耦合性,提高了代码的灵活性和可扩展性。

它目前的主要作用有:日志记录、安全控制、异常处理、事务处理、安全控制等功能。

.net8 中Aop的运用

首先说下:本篇Aop的运用是结合Autofac一起使用,如果对Autofac太不明白,请移步从0到1搭建权限管理系统系列四 .net8 中Autofac的使用

 安装:Castle.DynamicProxy(选择最新)、Autofac.Extras.DynamicProxy(选择最新,最新的这个好像是包含了Castle.DynamicProxy)

编写Aop插件(AopPlugIn),代码如下

/// <summary>
/// aop插件
/// </summary>
public class AopPlugIn : IInterceptor
{/// <summary>/// 拦截/// </summary>/// <param name="invocation"></param>public void Intercept(IInvocation invocation){//当前调用方法名称var methodName = invocation.Method.Name;//当前调用方法所在服务名称var interfaceServiceName = "I" + invocation.TargetType.Name;//获取当前调用的方法信息var methodInfo = invocation.Method;//当前方法参数数量var methodParameterCount = methodInfo.GetParameters().Length;// 当前接口所有参数foreach (var parameter in methodInfo.GetParameters()){//参数名称var ParameterName = parameter.Name;//参数值var ParameterValue = invocation.Arguments[parameter.Position];//参数类型var ParameterType = invocation.Arguments[parameter.Position] == null ? string.Empty : invocation.Arguments[parameter.Position].GetType().Name;}/*你可以在方法执行前,编写任何逻辑*///执行调用方法
        invocation.Proceed();/*你可以在方法执行后,编写任何逻辑*///当前接口返回值var value = invocation.ReturnValue;}
}

代码解释:该插件相当于一个拦截器,只要被Autofac注册的服务并且要求拦截,那么该服务下的所有接口都会进入拦截器中。

Intercept():在该aop中方法中可以获取当前调用接口的名称、服务名称、参数、返回值等

invocation.Proceed():执行当前调用的接口。在该方法前后做一些逻辑操作,如日志、性能监控、异常监控等。

在Autofac中添加Aop集成服务

如果对Autofac太不明白,请移步从0到1搭建权限管理系统系列四 .net8 中Autofac的使用

编写好aop的插件后,我们需要把aop插件集成到Autofac中,配合完成接口的拦截。代码如下

/// <summary>
/// Autofac插件
/// </summary>
public class AutofacPlugIn : Autofac.Module
{/// <summary>/// 重写Autofac的Load方法/// </summary>/// <param name="containerBuilder"></param>protected override void Load(ContainerBuilder containerBuilder){//服务项目程序集Assembly service = Assembly.Load("DomainService");Assembly intracface = Assembly.Load("Infrastructure");//注册aopcontainerBuilder.RegisterType(typeof(AopPlugIn));//项目必须以xxx结尾containerBuilder.RegisterAssemblyTypes(service).Where(n => n.Name.EndsWith("Service") && !n.IsAbstract).InstancePerLifetimeScope().AsImplementedInterfaces().InterceptedBy(typeof(AopPlugIn)).EnableInterfaceInterceptors();containerBuilder.RegisterAssemblyTypes(intracface).Where(n => n.Name.EndsWith("Repository") && !n.IsAbstract).InstancePerLifetimeScope().AsImplementedInterfaces();}
}

代码解释:containerBuilder.RegisterType(typeof(AopPlugIn));必须要先注册aop,然后通过InterceptedBy(typeof(AopPlugIn)).EnableInterfaceInterceptors()集成到Autofac中。

这里要注意下,我们可以在后面添加where条件,来确定哪些接口需要拦截。如果不添加,那么就会拦截Autofac中所有的接口

测试

aop的使用,其实就是一个拦截器,拦截被autofac注入的服务接口,所以配置非常简单,当然所有的技术都不是完美的,要看系统进行选择。

执行之前我们搭建好的接口

执行:查询所有用户接口GetAllUser()

可以看到,该接口被成功拦截。我们可以自由的在方法前后,添加业务逻辑,它不会改变原有接口逻辑。

以上是一些接口的基本信息,及返回值,当然我们可以获取更多接口的信息。

有了这些信息后,我们就可以做很多逻辑操作,比如之前说的:日志记录、性能监控、调用监控、异常信息、事务处理等。

 

以上就是全局异常捕获机制,感兴趣的可以下载项目,修改吧。

源代码地址:https://gitee.com/yangguangchenjie/overall-auth2.0-web-api  

预览地址:http://139.155.137.144:8880/swagger/index.html

帮我Star,谢谢。

有兴趣的朋友,请关注我微信公众号吧(*^▽^*)。

关注我:一个全栈多端的宝藏博主,定时分享技术文章,不定时分享开源项目。关注我,带你认识不一样的程序世界

 

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

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

相关文章

【日记】舞蹈是跟身体对话的一个过程(1451 字)

正文今天天气真好,天上一朵云都没有。本来上午就想着把被子拿出来晒,但想到中午还要睡觉,就变成下午了。晚上去收,发现被子上又落了一些桂花。想得很好,中午却几乎没有睡成觉。打游戏去了。中午过了黄眉。禁字诀真好用。都说难的第三阶段,我两次过。没什么人提起的第一阶…

网站密码忘记了怎么修改?

要修改网站的密码,通常可以按照以下步骤操作:访问登录页面:打开网站的登录页面。 寻找忘记密码选项:在登录表单附近通常会有一个“忘记密码”、“找回密码”或类似的链接。 输入注册邮箱或手机号:点击忘记密码链接后,系统会让你输入注册时使用的邮箱地址或手机号码。 查收…

怎么用admin后台修改网站?

要使用 admin 后台修改网站,通常可以按照以下步骤操作:登录后台管理系统:打开网站的管理后台 URL(例如 http://yourwebsite.com/admin)。 输入管理员用户名和密码进行登录。进入管理界面:登录后,你会看到后台管理界面,这里通常有各种管理功能和菜单项。选择要修改的内容…

模板类网站什么不能修改?网站信息在哪里修改密码?

对于模板类网站,有些内容可能无法直接修改,主要原因如下: 不能修改的内容核心代码:模板类网站的核心代码通常受到保护,不允许用户直接修改,以保证系统的稳定性和安全性。数据库结构:数据库结构通常也是固定的,不允许随意修改,以免破坏数据完整性。系统配置文件:一些关…

Project Euler 588 题解

down with copyright这玩意好像甚至有递推式……不太懂(为什么是图片?cnblogs 第一个公式没渲染成功) 时间复杂度是 \(O(4^{\deg F}\log K)\) 的。 #include<bits/stdc++.h> using namespace std; #define int long long const int maxn=100; int f[17][maxn],cur[10]…

闪迪SanDisk固态硬盘维修数据恢复

一、数据恢复方法 1.使用数据恢复——利用系统自带功能 对于Windows系统,可以尝试使用文件历史记录功能或撤销功能来恢复数据。 文件历史记录功能需要在之前已经开启并设置了备份。 撤销功能则适用于刚刚误删的文件,可以使用【Ctrl+Z】撤销删除组合快捷键或右键单击删除文件所…

ERQ:32位转5位仅掉些许精度,来看看两段式后训练量化 | ICML 2024

后训练量化(PTQ)在视觉Transformer(ViTs)领域引起了广泛关注,因为它在模型压缩方面表现出了高效率。然而,现有的方法通常忽视了量化权重和激活之间复杂的相互依赖关系,导致了相当大的量化误差。论文提出了一种名为ERQ的两步PTQ方法,精心设计用于顺序降低激活和权重量化…

QT打包exe(含错误解决方法)

打包工具windeployqt.exe运行报错QT5core库链接有问题 把打包工具路径下的libstdc++-6.dll文件粘贴到目标路径下(可以看到两个文件的大小是有差别的,具体原因未知)参考 https://blog.csdn.net/hanhui22/article/details/109595193