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)容器中注册的服务来解析的。这意味着可以在自定义过滤器的构造函数中注入所需的依赖。

示例:

csharp 复制代码
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 容器:

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

示例:

csharp 复制代码
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):

csharp 复制代码
[TypeFilter(typeof(MyCustomFilter))]
public class MyController : Controller
{
    // 控制器动作
}

// 或者在 Action 上:

[TypeFilter(typeof(MyCustomFilter))]
public IActionResult MyAction()
{
    // 动作逻辑
}

示例 (ServiceFilter):

csharp 复制代码
[ServiceFilter(typeof(MyCustomFilter))]
public class MyController : Controller
{
    // 控制器动作
}

// 或者在 Action 上:

[ServiceFilter(typeof(MyCustomFilter))]
public IActionResult MyAction()
{
    // 动作逻辑
}

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

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

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

相关推荐
IT规划师3 小时前
开源 - Ideal库 - 常用枚举扩展方法(一)
开源·c#·.net core·ideal库·枚举转换
小吴同学·16 小时前
(实战)WebApi第13讲:怎么把不同表里的东西,包括同一个表里面不同的列设置成不同的实体,所有的给整合到一起?【前端+后端】、前端中点击标签后在界面中显示
c#·.netcore·.net core
IT规划师1 天前
开源 - Ideal库 -获取特殊时间扩展方法(四)
开源·.net core·日期时间·ideal库
IT规划师2 天前
开源 - Ideal库 - 特殊时间扩展方法(三)
开源·.net core·ideal库
IT规划师4 天前
开源 - Ideal库 - 常用时间转换扩展方法(二)
开源·.net core·时间转换·ideal库
小吴同学·10 天前
.NET Core WebApi第6讲:WebApi的前端怎么派人去拿数据?(区别MVC)
.net core
小吴同学·13 天前
.NET Core WebApi第5讲:接口传参实现、数据获取流程、204状态码问题
c#·.net core
想起你的日子15 天前
asp.net core 入口 验证token,但有的接口要跳过验证
后端·.net core
小吴同学·17 天前
.NET Core WebApi第2讲:前后端分离,Restful
.net core
小吴同学·19 天前
第1讲(ASP.NET Core 6 Web Api 开发入门):第一个Web Api项目
.net core·1024程序员节