.NET 6 中,使用 ActionFilterAttribute 实现 AOP(面向切面编程)

AOP概述:AOP(面向切面编程)是一种编程规范的风格,通过'横切'的思想,将系统功能和业务功能分离开,以提高代码的可维护性和清晰度。

系统功能模块:

1、缓存模块:

作用:提高系统性能,通过缓存数据减少对数据库的直接访问。

操作:在代码进入业务功能之前的时候检查请求的数据中是否存在缓存中,如果不在就去数据库获取并存入缓存中。

2、验证模块:

作用:确保用户有权限访问特定业务方法。

操作:检查当前用户是否有权限,是否能进入下一步操作。

3.日志模块:

作用:记录用户操作和系统事件,便于后期分析和故障排查。

操作:在方法执行前后记录相关信息。

捕获异常后记录信息到日志中。

实现AOP:

可以通过创建一个自定义的过滤器类来实现。下面是一个简单的示例,演示如何创建和使用 ActionFilterAttribute 来拦截控制器动作,并在执行之前和之后插入自定义逻辑。

先安装依赖:

自定义过滤器实现类:

defaultActionFilter继承: ActionFilterAttribute 过滤器需要的方法。

 public class defaultActionFilter: ActionFilterAttribute{//在执行业务代码之前可以执行的方法public override void OnActionExecuting(ActionExecutingContext context){// 在动作执行之前执行的代码//实现一些系统功能代码Debug.WriteLine("执行控制器代码之前Action is executing...");}//在执行业务代码之后可以执行的方法public override void OnActionExecuted(ActionExecutedContext context){// 在动作执行之后执行的代码Debug.WriteLine("执行控制器代码之后Action has executed.");}//这些方法允许您在返回结果之前。您可以在这两个方法中处理结果(例如修改响应或记录结果信息)。public override void OnResultExecuting(ResultExecutingContext context){Console.WriteLine("返回结果之前");// 结果执行前]}//业务代码执行返回结果之后之后执行代码public override void OnResultExecuted(ResultExecutedContext context){// 结果执行后 可以执行的代码Console.WriteLine("返回结果之后");}}
注册过滤器:
通过使用依赖注入的方式,可以在应用程序的任意地方解析和使用这个过滤器。 
builder.Services.AddScoped<defaultActionFilter>();

调用过滤器: 

可以将过滤器应用到整个控制器或特定的动作方法上。

整个控制器:

 特定的动作方法:
  [Route("/test")][ServiceFilter(typeof(defaultActionFilter))][HttpGet]public async Task<object> Test(string id) {return id;}

 

执行结果:

使用这些方法,您可以在控制器的整个生命周期内插入自定义逻辑,处理验证、授权、异常、结果等。这使得您能够在不干扰业务逻辑的情况下,集中管理各种横切关注点,提高代码的可读性和可维护性。

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

拥塞控制算法的 rtt 公平性

我强调过&#xff0c;拥塞控制的核心在公平可用性&#xff0c;公平性由 buffer 动力学保证&#xff0c;而 buffer 动力学有两种表现形式&#xff1a; buffer 占比决定带宽占比&#xff0c;以 aimd 为例&#xff1b;带宽越小&#xff0c;buffer 挤兑加速比越大&#xff0c;以 b…

如何选择高品质SD卡

如何选择高品质SD卡 SD卡&#xff08;Secure Digital Memory Card&#xff09;是一种广泛使用的存储器件&#xff0c;因其快速的数据传输速度、可热插拔的特性以及较大的存储容量&#xff0c;广泛应用于各种场景&#xff0c;例如在便携式设备如智能手机、平板电脑、运动相机等…

作者分享|eDNA研究梯级水坝对浮游植物和浮游动物群落变化的影响

研究梯级水坝的影响对于了解和减轻其对环境的负面影响至关重要&#xff0c;浮游植物和浮游动物群落都对梯级水坝引起的变化尤为敏感。凌恩客户重庆师范大学生命科学学院水生态健康与环境安全实验室沈彦君课题组&#xff0c;通过eDNA宏条码技术对梯级水坝河道的浮游植物和浮游动…

uniapp实现在表单中展示多个选项,并且用户可以选择其中的一个或多个选项

前言 uni-data-checkbox是uni-app的一个组件,用于在表单中展示多个选项,并且用户可以选择其中的一个或多个选项。该组件可以通过设置不同的参数来控制选项的样式、布局和行为。 提示:以下是本篇文章正文内容,下面案例可供参考 uni-data-checkbox组件具有以下特点:: 1、跨…

威雅学校:2024线上3D艺术展精彩纷呈,让我们为孩子们的想象力喝彩!

Wycombe Abbey International Imaginarium 2024 IMAGINARIUM&#xff0c;是一个源于拉丁语的词汇&#xff0c;意为“想象的地方”或“幻想的世界”。在艺术和文化的领域中&#xff0c;它代表着展示创意、想象力和幻想的空间。 2024年度的威雅大家庭线上3D艺术展&#xff0c;正以…

ChatGLM-6B 部署与使用——打造你的专属GLM

ChatGLM-6B 部署与使用指南 ChatGLM-6B 是清华大学与智谱 AI 开源的一款对话语言模型&#xff0c;基于 General Language Model (GLM) 架构&#xff0c;参数达到 62 亿&#xff0c;因其卓越的语言理解与生成能力&#xff0c;受到广泛关注。 一、在 DAMODEL 上部署 ChatGLM-6B…

Vue使用axios二次封装、解决跨域问题

1、什么是 axios 在实际开发过程中&#xff0c;浏览器通常需要和服务器端进行数据交互。而 Vue.js 并未提供与服务器端通信的接口。从 Vue.js 2.0 版本之后&#xff0c;官方推荐使用 axios 来实现 Ajax 请求。axios 是一个基于 promise 的 HTTP 客户端。 关于 promise 的详细介…

MQ入门(一):同步调用和异步调用--RabbitMQ基础入门

目录 1.初识MQ 1.1.同步调用 1.2.异步调用 1.3.技术选型 2.RabbitMQ 2.1.安装部署 2.2.RabbitMQ基本架构 2.3.收发消息 2.3.1.交换机 2.3.2.队列 2.3.3.绑定关系 2.3.4.发送消息 2.4.数据隔离 2.4.1.用户管理 2.4.2.virtual host 1.初识MQ 微服务一旦拆分&…

水面巡检船垃圾漂浮物检测系统源码分享

水面巡检船垃圾漂浮物检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of …

HarmonyOS异常处理实践

一、HarmonyOS应用异常处理框架 全面检测、精准记录异常传播路径、日志精简 二、FaultLog FaultLog是应用异常日志查询接口&#xff0c;提供QuerySelfFaultLog接口以查询自身故障。 JS_CRASH&#xff1a;ArkTS程序故障类型 CPP_CRASH&#xff1a;C程序故障类型 APP_FREEZE&…

ClickHouse | 查询

1 ALL 子句 2 ARRAY JOIN 使用别名 :在使用时可以为数组指定别名&#xff0c;数组元素可以通过此别名访问&#xff0c;但数组本身则通过原始名称访问 3 DISTINCT子句 DISTINCT不支持当包含有数组的列 4 FROM子句 FROM 子句指定从以下数据源中读取数据: 1.表 2.子…

学习threejs,添加环境光和点光源

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言二、&#x1f340;绘制任意字体模型…

一文读懂SpringIoC的工作原理和机制(面试经)

导览 前言IoC(Inversion of Control)必学必看1. DI&#xff08;Dependency Injection&#xff09;2. IoC核心思想3. 创建Bean的方式3.1 构造函数3.2 构造静态方法3.3 构造实例工厂方法 4 依赖注入的方式4.1 setter注入4.2 构造方法注入4.3 接口注入 结语精彩回顾 前言 我们在使…

什么是Node.js?

为什么JavaScript可以在浏览器中被执行&#xff1f; 在浏览器中我们加载了一些待执行JS代码&#xff0c;这些字符串要当中一个代码去执行&#xff0c;是因为浏览器中有JavaScript的解析引擎&#xff0c;它的存在我们的代码才能被执行。 不同的浏览器使用不同的javaScript解析引…

阴影的基本原理

1、现实中阴影的产生规则 如图所示&#xff0c;现实中的阴影产生规则是&#xff0c;在不考虑光线反射的前提下&#xff0c;当一个光源发射的一条光线遇到一个不透明物体A时&#xff0c;这条光线就不能够再继续照亮其他物体了&#xff08;物体B的一部分&#xff09;&#xff0c…

等保2.0数据库测评之达梦数据库测评

一、达梦数据库介绍 达梦数据库管理系统属于新一代大型通用关系型数据库&#xff0c;全面支持 ANSI SQL 标准和主流编程语言接口/开发框架。行列融合存储技术&#xff0c;在兼顾 OLAP 和 OLTP 的同时&#xff0c;满足 HTAP 混合应用场景。 本次安装环境为Windows10专业版操作…

Docker:解决开发运维问题的开源容器化平台

云计算de小白 Docker是一个开源的容器化平台&#xff0c;可以将应用程序及其依赖的环境打包成轻量级、可移植的容器。 Docker为什么这么受欢迎呢?原因很简单&#xff1a;Docker可以解决不同环境一致运行的问题&#xff0c;而且占用资源少&#xff0c;速度快。 所以好的东西…

erlang学习:Linux命令学习6

for循环学习 打印九九乘法表 for i in {1..9};do %%取1-9for j in $(seq 1 $i);do %%取1-iecho -n "$j*$i$((i*j)) " %%进行九九乘法表打印doneecho done尝试了很多次报错是因为后面的换行符不对&#xff0c;window系统中的换行符与linux对不上&#xff0c;因…

Spring Boot 快速入门教程

1. Spring Boot 简介 Spring Boot 是一个基于 Spring 框架的项目&#xff0c;它简化了基于 Spring 的 Java 应用程序的创建和部署。Spring Boot 通过提供一系列的“Starters”来简化 Maven 配置&#xff0c;同时使用约定大于配置的原则&#xff0c;让开发者能够以最少的配置启…

李沐深度学习-多层感知机、模型选择、过拟合、欠拟合

3.8.1 隐藏层 多层感知机在单层神经网络的基础上引入了一到多个隐藏层&#xff08;hidden layer&#xff09;。隐藏层位于输入层和输出层之间。图3.3展示了一个多层感知机的神经网络图&#xff0c;它含有一个隐藏层&#xff0c;该层中有5个隐藏单元。 图3.3 带有隐藏层的多层感…