asp.net core 自定义过滤器 注入的几种方式和实现

在 ASP.NET Core 中,过滤器(Filters)是一种在 MVC 应用程序中运行代码的方法,可以在操作(Actions)执行之前或之后运行。过滤器可以应用于控制器(Controllers)或特定的操作方法。过滤器可以用来实现跨切面的逻辑,比如异常处理、授权、缓存、日志等。

有几种类型的过滤器:

  • 授权过滤器(Authorization filters)
  • 资源过滤器(Resource filters)
  • 操作过滤器(Action filters)
  • 异常过滤器(Exception filters)
  • 结果过滤器(Result filters)

自定义过滤器通常通过实现特定的过滤器接口来创建,如 IAuthorizationFilter, IResourceFilter, IActionFilter, IExceptionFilter, IResultFilter,或者通过继承 Filter 的抽象类,如 ActionFilterAttribute

过滤器的注入方式:

  1. 构造函数注入:在 ASP.NET Core 中,过滤器是通过依赖注入(DI)容器中注册的服务来解析的。这意味着可以在自定义过滤器的构造函数中注入所需的依赖。

示例:

public class MyCustomFilter : IActionFilter
{private readonly IMyDependency _myDependency;public MyCustomFilter(IMyDependency myDependency){_myDependency = myDependency;}public void OnActionExecuting(ActionExecutingContext context){// 使用 _myDependency}public void OnActionExecuted(ActionExecutedContext context){// 其他逻辑}
}

注: 这种方式要求过滤器本身也需要通过服务注册添加到 DI 容器:

services.AddScoped<IMyDependency, MyDependency>();
services.AddScoped<MyCustomFilter>();
  1. 服务查找:在过滤器内部通过服务定位器模式来解析服务。这通常在无法直接使用构造函数注入的情况下使用,例如使用属性注入或基于属性的过滤器。

示例:

public class MyCustomFilter : IActionFilter
{private IMyDependency _myDependency;public void OnActionExecuting(ActionExecutingContext context){_myDependency = context.HttpContext.RequestServices.GetService<IMyDependency>();// 使用 _myDependency}public void OnActionExecuted(ActionExecutedContext context){// 其他逻辑}
}

这种方法虽然方便,但有时会被认为是一个反模式,因为它违反了依赖注入的原则,并且使得依赖关系隐蔽而不是显式的。

  1. 通过 TypeFilter 或 ServiceFilter 属性注入:当你希望在过滤器属性中指定组件类型,并通过依赖注入容器来解析依赖时,可以使用 TypeFilterServiceFilter 属性。这两个属性允许您将服务添加到过滤器,并通过属性的方式应用到控制器或动作方法。

示例 (TypeFilter):

[TypeFilter(typeof(MyCustomFilter))]
public class MyController : Controller
{// 控制器动作
}// 或者在 Action 上:[TypeFilter(typeof(MyCustomFilter))]
public IActionResult MyAction()
{// 动作逻辑
}

示例 (ServiceFilter):

[ServiceFilter(typeof(MyCustomFilter))]
public class MyController : Controller
{// 控制器动作
}// 或者在 Action 上:[ServiceFilter(typeof(MyCustomFilter))]
public IActionResult MyAction()
{// 动作逻辑
}

注意 ServiceFilter 需要过滤器类型已经被注册到依赖注入容器。

  1. 使用 AddMvcOptions 或 AddControllers 添加全局过滤器:全局过滤器适用于所有控制器和操作方法。
services.AddControllers(options =>
{options.Filters.Add<MyCustomFilter>(); // 添加自定义全局过滤器
});

这些都是 ASP.NET Core 中注入自定义过滤器的常用方法。选择最佳方法主要取决于场景和需求,例如是否需要全局应用过滤器,或者是否希望通过依赖注入来解耦过滤器和它的依赖。

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

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

相关文章

Java-基础知识-包-带点不带点

在 IntelliJ IDEA 中&#xff0c;工程目录&#xff08;通常指的是项目的包结构或目录结构&#xff09;带点和不带点的区别主要是语义上的和约定上的。这里所说的“点”通常指的是在包名或目录名中的.字符。 带点的目录结构&#xff1a; 当您在 IntelliJ IDEA 中看到带点的目录…

Netty 应用与原理

更好的阅读体验 \huge{\color{red}{更好的阅读体验}} 更好的阅读体验 Java IO 模型 本篇示例代码仓库&#xff1a;learn-netty 基础概念 在 I/O 操作中有这么两组概念&#xff0c;其中同步/异步 要和线程中的同步线程/异步线程要区分开&#xff0c;这里指的是同步IO / 异步IO…

安全作业-1

1. windows登录的明文密码&#xff0c;存储过程是怎么样的&#xff0c;密文存在哪个文件下&#xff0c;该文件是否可以打开&#xff0c;并且查看到密文 用户在登录界面输入用户名和密码。Windows登录进程(winlogon.exe)接收用户的输入&#xff0c;并准备进行身份验证。Lsass处…

人脸识别开发项目汇总

1.基于FaceX-Zoo实现的人脸识别系统-CSDN博客 2.人脸识别&#xff1a;京东开源FaceX-Zoo&#xff1a;PyTorch工具箱 - 知乎 (zhihu.com) 3.人头识别-人群中准确快速的检测头部算法_在输入图像中检测人像头部的方法-CSDN博客 4.Github开源人脸识别项目face_recognition - 知乎…

ssm智能停车场管理系统

视频演示效果: SSMvue智能停车场 摘 要 本论文主要论述了如何使用JAVA语言开发一个智能停车场管理系统&#xff0c;本系统将严格按照软件开发流程进行各个阶段的工作&#xff0c;采用B/S架构&#xff0c;面向对象编程思想进行项目开发。在引言中&#xff0c;作者将论述智能停车…

Langchain实战:基于Chain实现Prompt的高级应用

Langchain实战 一. Langchain介绍二. 项目背景三. 代码实现3.1 导入必要的库并调用GPT大模型3.2 输出解析器(指定输出格式)3.3 定义Prompt模板3.4 构造LLMChain并推理3.5 解析推理结果3.6 异步调用 四. 参考文献 一. Langchain介绍 LangChain 是一个用于开发由语言模型驱动的应…

新兴游戏引擎Godot vs. 主流游戏引擎Unity和虚幻引擎,以及版本控制工具Perforce Helix Core如何与其高效集成

游戏行业出现一个新生事物——Godot&#xff0c;一个免费且开源的2D和3D游戏引擎。曾经由Unity和虚幻引擎&#xff08;Unreal Engine&#xff09;等巨头主导的领域如今迎来了竞争对手。随着最近“独特”定价模式的变化&#xff0c;越来越多的独立开发者和小型开发团队倾向于选择…

Vitis HLS 学习笔记--Syn Report解读(1)

目录 1. 介绍 2. 示例一 2.1 HLS 代码 2.2 Report 解读 2.2.1 General Information 2.2.2 Timing Estimate 2.2.3 Performance & Resource Estimates 2.2.4 HW interfaces 2.2.4.1 硬件接口报告 2.2.4.2 导出至 Vivado 中的 IP 2.2.4.3 Port-Level Protocols 端…

掌握Unix路径简化:五种有效算法比较【python力扣71题】

题目描述 给你一个字符串 path&#xff0c;表示一个 Unix 风格的绝对路径&#xff0c;请你简化它并返回。 Unix 风格的绝对路径中&#xff0c;.. 表示返回上一级目录&#xff0c;. 表示当前目录。简化路径必须始终以斜杠 / 开头&#xff0c;并且两个目录名之间必须只有一个斜…

图形化编程要怎么做

0. 简介 Scratch其实应该算得上最早做图形化编程的工程了。Scratch 是麻省理工学院的“终身幼儿园团队”在 2007 年 [5]发布的一种图形化编程工具&#xff0c;主要面对全球青少年开放&#xff0c;是图形化编程工具当中最广为人知的一种&#xff0c;所有人都可以在软件中创作自…

排序算法-计数排序

一、计数排序 这种排序算法 是利用数组下标来确定元素的正确位置的。 如果数组中有20个随机整数&#xff0c;取值范围为0~10&#xff0c;要求用最快的速度把这20个整数从小到大进行排序。 很大的情况下&#xff0c;它的性能甚至快过那些时间复杂度为O(nlogn&#xff09;的排序。…

【React】Sigma.js框架网络图-入门篇(2)

通过《【React】Sigma.js框架网络图-入门篇》有了基本认识 由于上一篇直接给出了基本代码示例&#xff0c;可能看着比较复杂也不知道是啥意思&#xff1b; 今天从理论入手重新认识下&#xff01; 一、基本认识 首先&#xff0c;我们先了解下基础术语&#xff1a; 图(Graph)&…

python coverage如何使用

Python的coverage.py是一个测量代码覆盖率的工具&#xff0c;它可以告诉你在测试中哪些代码被执行了&#xff0c;哪些没有。这对于确保你的测试覆盖了所有情况非常有用。以下是如何使用coverage.py的基本步骤&#xff1a; ### 安装 首先&#xff0c;你需要安装coverage.py。你…

如何实现直播声卡反向给手机充电功能呢?

在数字化时代的浪潮中&#xff0c;声卡作为多媒体系统的核心组件&#xff0c;扮演着声波与数字信号相互转换的关键角色。它不仅能够将来自各类音源的原始声音信号转换为数字信号&#xff0c;进而输出到各类声响设备&#xff0c;更能够通过音乐设备数字接口(MIDI)发出合成乐器的…

Eudic欧路词典for Mac:专业英语学习工具

Eudic欧路词典for Mac&#xff0c;作为专为Mac用户设计的英语学习工具&#xff0c;凭借其简捷高效的特点&#xff0c;成为众多英语学习者不可或缺的助手。 Eudic欧路词典for Mac v4.6.4激活版下载 这款词典整合了多个权威词典资源&#xff0c;如牛津、柯林斯、朗文等&#xff0…

​「Python大数据」词频数据渲染词云图导出HTML

前言 本文主要介绍通过python实现数据聚类、脚本开发、办公自动化。词频数据渲染词云图导出HTML。 一、业务逻辑 读取voc数据采集的数据批处理,使用jieba进行分词,去除停用词词频数据渲染词云图将可视化结果保存到HTML文件中二、具体产出 三、执行脚本 python wordCloud.p…

mysql中日期函数now()和sysdate()的区别

说明&#xff1a; 在mysql数据库中&#xff0c;now()、sysdate() 都是获取系统当前日期时间 区别&#xff1a; 示例脚本&#xff1a; select sleep(2),now(),sysdate() from dual; 输出&#xff1a; 小结&#xff1a; 1、 now()和sysdate()都可以获取系统当前日期时间 2、区别…

第30篇 RPC概述

RPC&#xff08;Remote Procedure Call&#xff0c;远程过程调用&#xff09;是一种编程技术&#xff0c;使得开发者能够像调用本地函数一样调用位于不同进程、不同主机上的函数或服务。这种技术隐藏了底层网络通信细节&#xff0c;使得分布式系统中的组件能够无缝协作&#xf…

【无标题】getchar gets scanf

getchar与putchar的用法 getchar一次只接收一个字符 #include<stdio.h>int main() { char ch 0;while ((ch getchar()) ! \n){putchar(ch);} } #include <stdio.h> #define SPACE // SPACE表示一个空格字符 int main() { char ch; ch getch…

优化SQL的方法

来自组内分享&#xff0c;包含了比较常使用到的八点&#xff1a; 避免使用select * union all代替union 小表驱动大表 批量操作 善用limit 高效的分页 用连接查询代替子查询 控制索引数量 一、避免使用select * 消耗数据库资源 消耗更多的数据库服务器内存、CPU等资源。 消…