说明

该文章是属于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,谢谢。

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

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

(系列七).net8 Aop切面编程的更多相关文章

  1. Spring MVC通过AOP切面编程 来拦截controller 实现日志的写入

    首选需要参考的是:[参考]http://www.cnblogs.com/guokai870510826/p/5977948.html    http://www.cnblogs.com/guokai8 ...

  2. Spring AOP 切面编程记录日志和接口执行时间

    最近客户现在提出系统访问非常慢,需要优化提升访问速度,在排查了nginx.tomcat内存和服务器负载之后,判断是数据库查询速度慢,进一步排查发现是因为部分视图和表查询特别慢导致了整个系统的响应时间特 ...

  3. AOP切面编程在android上的应用

    代码地址如下:http://www.demodashi.com/demo/12563.html 前言 切面编程一直是一个热点的话题,这篇文章讲讲一个第三方aop库在android上的应用.第三方AOP ...

  4. SpringBoot2.0 基础案例(11):配置AOP切面编程,解决日志记录业务

    本文源码 GitHub地址:知了一笑 https://github.com/cicadasmile/spring-boot-base 一.AOP切面编程 1.什么是AOP编程 在软件业,AOP为Asp ...

  5. 注解与AOP切面编程实现redis缓存与数据库查询的解耦

    一般缓存与数据库的配合使用是这样的. 1.查询缓存中是否有数据. 2.缓存中无数据,查询数据库. 3.把数据库数据插入到缓存中. 其实我们发现 1,3 都是固定的套路,只有2 是真正的业务代码.我们可 ...

  6. 十:SpringBoot-配置AOP切面编程,解决日志记录业务

    SpringBoot-配置AOP切面编程,解决日志记录业务 1.AOP切面编程 1.1 AOP编程特点 1.2 AOP中术语和图解 2.SpringBoot整合AOP 2.1 核心依赖 2.2 编写日 ...

  7. Spring AOP 切面编程的方法

    spring aop的使用分为两种,一种是使用注解来实现,一种是使用配置文件来实现. 先来简单的介绍一下这两种方法的实现,接下来详细的介绍各处的知识点便于查阅.目录如下: 1.基于注解实现spring ...

  8. AOP 切面编程

    简介 如果你很熟悉面向方面编程(AOP),你就会知道给代码增加“切面”可以使代码更清晰并且具有可维护性.但是AOP通常都依赖于第三方类库或者硬编码的.net特性来工作.虽然这些实现方式的好处大于它们的 ...

  9. AOP 切面编程------JoinPoint ---- log日志

    AOP 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件 ...

  10. Spring基础篇——Spring的AOP切面编程

    一  基本理解 AOP,面向切面编程,作为Spring的核心思想之一,度娘上有太多的教程啊.解释啊,但博主还是要自己按照自己的思路和理解再来阐释一下.原因很简单,别人的思想终究是别人的,自己的理解才是 ...

随机推荐

  1. DirectX9(D3D9)游戏开发:高光时刻录制和共享纹理的踩坑

    共享纹理 老游戏使用directx9无法直接与cc高光sdk(d3d11)对接,但是d3d9ex有共享纹理,我们通过共享纹理把游戏画面共享给cc录制,记录一些踩坑的笔记. 共享纹理示例: // 初始化 ...

  2. 论文写作:写回复意见时的套话 (reviews and comments)

    Typos, Grammar, and Citation Errors: We acknowledge the need for a thorough proofreading to rectify ...

  3. 支持AMD GPU —— 如何运行docker环境下的Jax环境

    相关: 支持NVIDIA GPU -- 如何运行docker环境下的Jax环境 官方给出的安装主页: https://hub.docker.com/r/rocm/jax 安装命令: docker pu ...

  4. 国内的开源AI模型共享网站(AI模型的GitHub)—— mindscope —— 使用git lfs方式下载模型文件

    参考前文: 国内的开源AI模型共享网站(AI模型的GitHub)-- mindscope -- 对标外网的"huggingface",mindscope好用吗? 使用git lfs ...

  5. 国产计算框架mindspore在gpu环境下1.3.0版本的分布式计算组件安装 ——(openmpi 和 nccl 的安装,配置,示例代码的运行)

    前文已经给出1.3.0gpu版本的编译及安装,本文在此基础上进行分布式组件的安装,前文信息参看: 国产计算框架mindspore在gpu环境下编译分支r1.3,使用suod权限成功编译并安装,成功运行 ...

  6. Cython.Compiler.Errors.CompileError: Cython.Compiler.Errors.CompileError: /home/devil/anaconda3/envs/chainerRL/lib/python3.6/site-packages/mujoco_py/cymj.pyx

    ubuntu系统下,python3.6,anaconda下配置mujoco210环境时遇到报错: /home/devil/anaconda3/envs/chainerRL/lib/python3.6/ ...

  7. Spring Boot 中使用 JSON Schema 来校验复杂JSON数据

    JSON是我们编写API时候用于数据传递的常用格式,那么你是否知道JSON Schema呢? 在数据交换领域,JSON Schema 以其强大的标准化能力,为定义和规范 JSON 数据的结构与规则提供 ...

  8. centos7系统 通过编译安装gcc7.5.0

    背景: 现有的centos7 gcc的最高版本为4.8.5 项目需要升级到7.1.0以上 正常方式可以通过以下命令即可完成升级: $ sudo yum install centos-release-s ...

  9. 深度解读昇腾CANN小shape算子计算优化技术,进一步减少调度开销

    摘要:Host调度模式下,GE将模型中算子的执行单元划分为Host CPU执行与Device(昇腾AI处理器)执行两大类. 本文分享自华为云社区<深度解读昇腾CANN小shape算子计算优化技术 ...

  10. 解密Prompt系列36. Prompt结构化编写和最优化算法UNIPROMPT

    上一章我们聊了标准化的Prompt生成方案DSPy,但DSPy还是更多依赖few-shot的Prompt编写范式,在纯任务描述型指令上的优化效果有限.这一章我们就重点关注描述性指令优化.我们先简单介绍 ...