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

ops/2024/9/23 1:02:59/

在 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.ppmy.cn/ops/19586.html

相关文章

小程序APP屏幕悬浮按钮可拖动可展开

示例&#xff1a; 插件地址&#xff1a;suspensionButton 悬浮按钮 - DCloud 插件市场 使用方式&#xff1a; import pxSuspenButton from /components/px-suspen-button/index components: { pxSuspenButton }, <pxSuspenButton :centerIcon"centerIcon" :bgCo…

已解决:ModuleNotFoundError : No module named ‘pandas 亲测有效!!!

已解决&#xff1a;ModuleNotFoundError : No module named ‘pandas 亲测有效&#xff01;&#xff01;&#xff01; 亲测有效 报错问题报错原因解决方法 报错问题 当您遇到 ModuleNotFoundError: No module named pandas 错误时&#xff0c;这意味着Python环境中没有安装pan…

【无标题】设备开关指示灯状态智能识别是什么意思---豌豆云

本文将详细解释设备开关指示灯状态智能识别的含义&#xff0c;介绍其工作原理及在各个领域的应用&#xff0c;旨在帮助大家更好地理解这一前沿技术。 随着科技的不断发展&#xff0c;智能化已经成为了现代生活的重要特征。 在设备监控与管理领域&#xff0c;设备开关指示灯状…

react,Chart

一、基础图&#xff1a;https://ant-design-charts.antgroup.com/ Ant Design Charts 1. 首先要下载ant-design/charts&#xff0c;然后在页面中添加如下柱状图代码: import React from react; import { Column } from ant-design/chartsconst DemoColumn: React.FC () …

Docker常用命令(镜像、容器)

一、镜像 1.1 存出镜像 1.2 载入镜像 1.3 上传镜像 二、容器 2.1 容器创建 2.2 查看容器的运行状态 ​2.3 启动容器 2.4 创建并启动容器 2.5 在后台持续运行 docker run 创建的容器 2.6 终止容器运行 2.7 容器的进入 ​2.8把宿主机的文件传入到容器内部 2.9 从容器…

【VSCode调试技巧】Pytorch分布式训练调试

最近遇到个头疼的问题&#xff0c;对于单机多卡的训练脚本&#xff0c;不知道如何使用VSCode进行Debug。 解决方案&#xff1a; 1、找到控制分布式训练的启动脚本&#xff0c;在自己的虚拟环境的/lib/python3.9/site-packages/torch/distributed/launch.py中 2、配置launch.…

【继承和多态】

闭上眼睛&#xff0c;什么都不听.............................................................................................................. 文章目录 前言 一、【继承】 1.1【继承的概念】 1.2【 继承的定义】 1.2.1【定义格式】 1.2.2【继承关系和访问限定符】 1.2…

如何备考华为OD机试?如何刷题以取得高分?常考的算法类型?

华为OD机试通常指的是华为在线开发&#xff08;Onsite Development&#xff09;机试&#xff0c;是华为公司招聘过程中的一项技术测试&#xff0c;主要针对求职者的编程能力和技术水平进行评估。这种机试通常包括编程题和技术题&#xff0c;目的是测试应聘者在实际工作中遇到问…