论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
ToB企服应用市场:ToB评测及商务社交产业平台
»
论坛
›
软件与程序人生
›
后端开发
›
.Net
›
(系列七).net8 Aop切面编程
(系列七).net8 Aop切面编程
尚未崩坏
金牌会员
|
2024-10-16 16:15:46
|
显示全部楼层
|
阅读模式
楼主
主题
911
|
帖子
911
|
积分
2733
说明
该文章是属于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");
//注册aop
containerBuilder.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,谢谢。
有兴趣的朋友,请关注我微信公众号吧(*^▽^*)。
关注我:一个全栈多端的宝藏博主,定时分享技术文章,不定时分享开源项目。关注我,带你认识不一样的程序世界
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
回复
使用道具
举报
0 个回复
倒序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
发新帖
回复
尚未崩坏
金牌会员
这个人很懒什么都没写!
楼主热帖
读高性能MySQL(第4版)笔记01_MySQL架 ...
鸿蒙DevEco Studio3.0——开发环境搭建 ...
SQL Server向表中插入数据
Webpack的使用
Redis命令手册
金三银四好像消失了,IT行业何时复苏! ...
关于对四维空间一些理解
慢SQL,压垮团队的最后一根稻草! ...
容器开发运维人员的 Linux 操作机配置 ...
TiDB 底层存储结构 LSM 树原理介绍 ...
标签云
挺好的
服务器
快速回复
返回顶部
返回列表