有关C# .NET Core 过滤器的使用

想用一个过滤器实现特定接口的审核日志记录,结果报了错,看了看感觉有些基础要补,所以想记录下来

错误:

在属性过滤器中使用了依赖注入,结果在应用在控制层接口时报了传参的错

cs 复制代码
//过滤器
public class AuditRecordFilter: ActionFilterAttribute
{
    private readonly ISysAuditRecordService _sysAuditRecordService; // 注入日志服务
    /// <summary>
    /// 会话管理接口
    /// </summary>
    private readonly TokenManager _tokenManager;

    public AuditRecordFilter( ISysAuditRecordService sysAuditRecordService, TokenManager tokenManager)
    {
        _sysAuditRecordService = sysAuditRecordService;
        _tokenManager = tokenManager;
    }
...

控制层:

原因:

****ASP.NET Core 框架中的生命周期管理 和服务解析机制。

在 ASP.NET Core 中,依赖项 是通过**依赖注入容器(DI容器)**来解析的。这个容器会自动为需要依赖的对象(如服务、仓储等)提供相应的实例。

理论上,这些依赖应该由 ASP.NET Core 的 DI 容器注入。但是,如果你直接在控制器方法上使用属性形式的 [AuditRecordFilter],由于它是编译时静态定义的,框架不会通过依赖注入自动解析这些服务。这就是为什么在使用某些属性过滤器时,会有依赖项无法解析的错误。

ASP.NET Core 的属性过滤器(例如 [AuditRecordFilter])在编译时 就已经创建。也就是说,过滤器实例在 ASP.NET Core 依赖注入容器有机会参与之前就已经被创建,因此 DI 容器无法为过滤器的构造函数注入依赖项。这导致你看到的错误提示,表明无法解析 ISysAuditRecordService 等依赖。

错误的原因是: 使用属性过滤器时,过滤器实例化发生在编译时,而非运行时,框架不会自动为这些属性过滤器提供依赖项。

解决方案:

改为使用TypeFilter 或 ServiceFilter

二者实现的区别

这里我用了TypeFilter ,在具体的过滤器中不需要特别改什么

cs 复制代码
//控制层接口标注
 [TypeFilter(typeof(AuditRecordFilter),Arguments =new object[] {3})]

其中的Arguments可用过滤器的构造函数拿到,这个可做接口区别判断之类的功能,更灵活一些 。

相关推荐
samble7 小时前
从零搭建灌装监控系统(十):生产追溯,条码触发自动记录
c#·wpf·mvvm·modbus·工业控制
czhc114007566311 小时前
退出防呆:用“总闸“收口所有退出入口,以及三个并发语法坑
开发语言·c#
淡海水14 小时前
02-01-原理篇-Mark-Sweep与变种算法
算法·unity·c#·游戏引擎·.net·gc
UIU11417 小时前
同一个变量在两个 .c 文件里类型不一致,程序会怎样?
c++·学习·c#
波力海苔夹心脆6751 天前
C# 值类型与引用类型详解:存储位置、赋值机制、参数传递、相等比较、装箱拆箱与常见陷阱
开发语言·jvm·经验分享·笔记·c#·.net
估值探索者1 天前
【Python量化策略实战 #02】多因子合成mom和vol两因子打分合成
开发语言·c++·python·数据挖掘·c#
淡海水2 天前
01-04-认知篇-Unity内存全景
unity·c#·游戏引擎·.net·gc
淡海水2 天前
01-03-认知篇-C#内存模型深度解析
unity·c#·游戏引擎·.net·gc
lzhdim2 天前
C#不为人知的10个魔法特性:资深开发者也会震惊的底层奥秘
java·前端·javascript·算法·c#
前端 贾公子2 天前
LangChain核心组件 == 提示词(Prompts)
开发语言·c#