ABP框架9——自定义拦截器的实现与使用

news2025/2/11 14:36:19

一、AOP编程

  • AOP定义:面向切片编程,着重强调功能,将功能从业务逻辑分离出来。
  • AOP使用场景:处理通用的、与业务逻辑无关的功能(如日志记录、性能监控、事务管理等)
  • 拦截器:拦截方法调用并添加额外的行为,比如日志记录、权限检查等
  • 拦截器是 AOP 编程的一种实现方式

二、拦截器在ABP框架中的写法位置

1.在应用层-拦截器文件夹编写拦截器

2.在应用层-相应模块类注册拦截器

三、版本一(不推荐,ABP封装拦截器)

不推荐是因为很多功能都不支持,比如说查特性、查路由、接口名称等,不过捕捉日志还是可以的!

1.应用层

using Acme.BookStore.Books;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
using Volo.Abp.DynamicProxy;

namespace Acme.BookStore.Interceptor
{
    //应用层
    public class AopInterceptor : AbpInterceptor, ITransientDependency
    {
        public override async Task InterceptAsync(IAbpMethodInvocation invocation)
        {
            try
            {
                //入参
                var arguments = invocation.Arguments;

                // 在方法执行前输出日志
                Trace.WriteLine($"【调用方法】: {invocation.Method.Name},【时间】{DateTime.Now},【入参】: {string.Join(",", arguments)}");

                // 继续执行原方法
                await invocation.ProceedAsync();
                var returnValue = invocation.ReturnValue;
                // 在方法执行后输出日志
                Trace.WriteLine($"方法执行完成,出参数【{returnValue}】");
            }
            catch (Exception ex)
            {
                // 模拟捕捉错误并输出日志
                Trace.WriteLine($"方法 {invocation.Method.Name} 执行发生错误: {ex.Message}, {DateTime.Now}");
            }
        }
    }

}

2.模块类

using Acme.BookStore.Interceptor;
using Microsoft.Extensions.DependencyInjection;
using Newtonsoft.Json;
using System;
using System.Diagnostics;
using System.Linq;
using Volo.Abp.Account;
using Volo.Abp.AutoMapper;
using Volo.Abp.DependencyInjection;
using Volo.Abp.DynamicProxy;
using Volo.Abp.FeatureManagement;
using Volo.Abp.Identity;
using Volo.Abp.Json;
using Volo.Abp.Json.SystemTextJson;
using Volo.Abp.Modularity;
using Volo.Abp.PermissionManagement;
using Volo.Abp.SettingManagement;
using Volo.Abp.TenantManagement;
using Volo.Abp.Uow;

namespace Acme.BookStore;

[DependsOn(
    typeof(BookStoreDomainModule),
    typeof(AbpAccountApplicationModule),
    typeof(BookStoreApplicationContractsModule),
    typeof(AbpIdentityApplicationModule),
    typeof(AbpPermissionManagementApplicationModule),
    typeof(AbpTenantManagementApplicationModule),
    typeof(AbpFeatureManagementApplicationModule),
    typeof(AbpSettingManagementApplicationModule)
    )]
public class BookStoreApplicationModule : AbpModule
{
    public override void ConfigureServices(ServiceConfigurationContext context)
    {
        Configure<AbpAutoMapperOptions>(options =>
        {
            options.AddMaps<BookStoreApplicationModule>();
        });

        // 注册拦截器
        context.Services.OnRegistred(ctx =>
        {
            if (ctx.Interceptors.Any())
            {
                ctx.Interceptors.TryAdd<AopInterceptor>();
            }
        });
    }
}

四、版本二(推荐 MVCcore过滤器)

1.应用层

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Controllers;
using Microsoft.AspNetCore.Mvc.Filters;
using System;
using System.Diagnostics;
using System.Linq;
using Volo.Abp.DependencyInjection;

namespace Acme.BookStore.Interceptor
{
    //应用层
    public class AopInterceptor : IActionFilter, ITransientDependency 
    {
        /// <summary>
        /// 请求之前
        /// </summary>
        /// <param name="context"></param>
        public void OnActionExecuting(ActionExecutingContext context)
        {
            //方法名称
            var methodName = (context.ActionDescriptor as ControllerActionDescriptor)?.ActionName;
            // 特性
            var arrt = context.ActionDescriptor.EndpointMetadata.OfType<Attribute>();
            //判断是否含有某个特性标签
            bool hasMyCustomAttribute = arrt.Any(attr => attr.GetType() == typeof(AopAttribute));
            Trace.WriteLine($"执行前:【路由】{context.ActionDescriptor.AttributeRouteInfo?.Template},【方法】{methodName},【入参】{context?.ActionArguments},【特性】{arrt},【请求方式】{context.HttpContext.Request.Method}");
        }

        /// <summary>
        /// 请求之后
        /// </summary>
        /// <param name="context"></param>
        public void OnActionExecuted(ActionExecutedContext context)
        {
            var res = context.Result as ObjectResult;
            Trace.WriteLine($"执行后:【出参】{res?.Value}");
        }
    }

    /// <summary>
    /// 自定义特性标签(可选)
    /// </summary>
    [AttributeUsage(AttributeTargets.Interface | AttributeTargets.Class | AttributeTargets.Method)]
    public class AopAttribute : Attribute { }
}

2.模块类

using Acme.BookStore.Interceptor;
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.Account;
using Volo.Abp.AutoMapper;
using Volo.Abp.FeatureManagement;
using Volo.Abp.Identity;
using Volo.Abp.Json;
using Volo.Abp.Modularity;
using Volo.Abp.PermissionManagement;
using Volo.Abp.SettingManagement;
using Volo.Abp.TenantManagement;


namespace Acme.BookStore;

[DependsOn(
    typeof(BookStoreDomainModule),
    typeof(AbpAccountApplicationModule),
    typeof(BookStoreApplicationContractsModule),
    typeof(AbpIdentityApplicationModule),
    typeof(AbpPermissionManagementApplicationModule),
    typeof(AbpTenantManagementApplicationModule),
    typeof(AbpFeatureManagementApplicationModule),
    typeof(AbpSettingManagementApplicationModule)
    )]
public class BookStoreApplicationModule : AbpModule
{
    public override void ConfigureServices(ServiceConfigurationContext context)
    {
        Configure<AbpAutoMapperOptions>(options =>
        {
            options.AddMaps<BookStoreApplicationModule>();
        });

        // 注册拦截器
        context.Services.AddMvcCore(x=> x.Filters.Add<AopInterceptor>());

    }
}

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

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

相关文章

CUDA 计算平台 CUDA 兼容性【笔记】

在 b 站看过的两个关于 CUDA 的技术分享&#xff0c;整理分享下对自己有用的课件。 20231130 2023第9期 聊一聊常见的AI计算平台库_哔哩哔哩_bilibili20230831 2023第6期 聊一聊CUDA兼容性_哔哩哔哩_bilibili 文章目录 CUDA 计算平台CUDA 函数库介绍英伟达三大护城河&#xff1…

最新消息 | 德思特荣获中国创新创业大赛暨广州科技创新创业大赛三等奖!

2024年12月30日&#xff0c;广州市科技局公开第十三届中国创新创业大赛&#xff08;广东广州赛区&#xff09;暨2024年广州科技创新创业大赛决赛成绩及拟获奖企业名单&#xff0c;德思特获得了智能与新能源汽车初创组【第六名】【三等奖】的好成绩&#xff01; 关于德思特&…

ubuntu安装VMware报错/dev/vmmon加载失败

ubuntu安装VMware报错/dev/vmmon加载失败&#xff0c;解决步骤如下&#xff1a; step1&#xff1a;为vmmon和vmnet组件生成密钥对 openssl req -new -x509 -newkey rsa:2048 -keyout VMW.priv -outform DER -out VMW.der -nodes -days 36500 -subj "/CNVMware/"ste…

python的列表、元组、深拷贝、浅拷贝(四)

python的列表 一、序列1. 序列定义2. 序列数据类型包括3.特点&#xff1a;都支持下面的特性 二、 列表1. 列表的创建2. 列表的基本特性(1) 连接操作符喝重复操作符(2) 成员操作符&#xff08;in , not in &#xff09;(3) 索引(4) 切片练习(5) for循环 3. 列表的常用方法(1) 一…

2.10作业

思维导图 C C语言

【深度学习】多目标融合算法(四):多门混合专家网络MMOE(Multi-gate Mixture-of-Experts)

目录 一、引言 二、MMoE&#xff08;Multi-gate Mixture-of-Experts&#xff0c;多门混合专家网络&#xff09; 2.1 技术原理 2.2 技术优缺点 2.3 业务代码实践 2.3.1 业务场景与建模 2.3.2 模型代码实现 2.3.3 模型训练与推理测试 2.3.4 打印模型结构 三、总结 一、…

RuoYi-Vue-Oracle的oracle driver驱动配置问题ojdbc8-12.2.0.1.jar的解决

RuoYi-Vue-Oracle的oracle driver驱动配置问题ojdbc8-12.2.0.1.jar的解决 1、报错情况 下载&#xff1a;https://gitcode.com/yangzongzhuan/RuoYi-Vue-Oracle 用idea打开&#xff0c;启动&#xff1a; 日志有报错&#xff1a; 点右侧m图标&#xff0c;maven有以下报误 &…

C# OpenCV机器视觉:对位贴合

在热闹非凡的手机维修街上&#xff0c;阿强开了一家小小的手机贴膜店。每天看着顾客们自己贴膜贴得歪歪扭扭&#xff0c;不是膜的边缘贴不整齐&#xff0c;就是里面充满了气泡&#xff0c;阿强心里就想&#xff1a;“要是我能有个自动贴膜的神器&#xff0c;那该多好啊&#xf…

Baumer工业相机堡盟相机的相机传感器芯片清洁指南

Baumer工业相机堡盟相机的相机传感器芯片清洁指南 Baumer工业相机1.Baumer工业相机传感器芯片清洁工具和清洁剂2.Baumer工业相机传感器芯片清洁步骤2.1、准备步骤2.2、清洁过程1.定位清洁工具2.清洁传感器3&#xff0e;使用吹风装置 Baumer工业相机传感器芯片清洁的优势设计与结…

《我在技术交流群算命》(三):QML的Button为什么有个蓝框去不掉啊(QtQuick.Controls由Qt5升级到Qt6的异常)

有群友抛出类似以下代码和运行效果截图&#xff1a; import QtQuick import QtQuick.ControlsWindow {width: 640height: 480visible: truetitle: qsTr("Hello World")Button{anchors.centerIn: parentwidth: 100height: 40background: Rectangle {color: "red…

Golang:Go 1.23 版本新特性介绍

流行的编程语言Go已经发布了1.23版本&#xff0c;带来了许多改进、优化和新特性。在Go 1.22发布六个月后&#xff0c;这次更新增强了工具链、运行时和库&#xff0c;同时保持了向后兼容性。 Go 1.23 的新增特性主要包括语言特性、工具链改进、标准库更新等方面&#xff0c;以下…

在 PyTorch 中理解词向量,将单词转换为有用的向量表示

你要是想构建一个大型语言模型&#xff0c;首先得掌握词向量的概念。幸运的是&#xff0c;这个概念很简单&#xff0c;也是本系列文章的一个完美起点。 那么&#xff0c;假设你有一堆单词&#xff0c;它可以只是一个简单的字符串数组。 animals ["cat", "dog…

deepseek API 调用-python

【1】创建 API keys 【2】安装openai SDK pip3 install openai 【3】代码&#xff1a; https://download.csdn.net/download/notfindjob/90343352

Git、Github和Gitee完整讲解:丛基础到进阶功能

第一部分&#xff1a;Git 是什么&#xff1f; 比喻&#xff1a;Git就像是一本“时光机日记本” 每一段代码的改动&#xff0c;Git都会帮你记录下来&#xff0c;像是在写日记。如果出现问题或者想查看之前的版本&#xff0c;Git可以带你“穿越回过去”&#xff0c;找到任意时间…

相对收益-固定收益组合归因-加权久期归因模型

固定收益组合归因-加权久期归因模型和Campisi模型 1 加权久期归因模型--推导方式11.1 债券策略组合收益率的分解1.1.2 加权久期归因&#xff08;1&#xff09;总久期贡献&#xff08;2&#xff09;债券类属配置贡献 1.1.3 如何应用加权久期归因 2 加权久期归因模型--推导方式22…

原生鸿蒙版小艺APP接入DeepSeek-R1,为HarmonyOS应用开发注入新活力

原生鸿蒙版小艺APP接入DeepSeek-R1&#xff0c;为HarmonyOS应用开发注入新活力 在科技飞速发展的当下&#xff0c;人工智能与操作系统的融合正深刻改变着我们的数字生活。近日&#xff0c;原生鸿蒙版小艺APP成功接入DeepSeek-R1&#xff0c;这一突破性进展不仅为用户带来了更智…

RabbitMQ 从入门到精通:从工作模式到集群部署实战(三)

文章目录 使用CLI管理RabbitMQrabbitmqctlrabbitmq-queuesrabbitmq-diagnosticsrabbitmq-pluginsrabbitmq-streamsrabbitmq-upgraderabbitmqadmin 使用CLI管理RabbitMQ RabbitMQ CLI 工具需要安装兼容的 Erlang/OTP版本。 这些工具假定系统区域设置为 UTF-8&#xff08;例如en…

傅里叶单像素成像技术研究进展

摘要&#xff1a;计算光学成像&#xff0c;通过光学系统和信号处理的有机结合与联合优化实现特定成像特性的成像系统&#xff0c;摆脱了传统成像系统的限制&#xff0c;为光学成像技术添加了浓墨重彩的一笔&#xff0c;并逐步向简单化与智能化的方向发展。单像素成像(Single-Pi…

MariaDB *MaxScale*实现mysql8读写分离

1.MaxScale 是干什么的&#xff1f; MaxScale是maridb开发的一个mysql数据中间件&#xff0c;其配置简单&#xff0c;能够实现读写分离&#xff0c;并且可以根据主从状态实现写库的自动切换&#xff0c;对多个从服务器能实现负载均衡。 2.MaxScale 实验环境 中间件192.168.12…

计算机毕业设计Spark+大模型知网文献论文推荐系统 知识图谱 知网爬虫 知网数据分析 知网大数据 知网可视化 预测系统 大数据毕业设计 机器学习

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…