当前位置: 首页 > article >正文

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

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

错误:

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

//过滤器
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 ,在具体的过滤器中不需要特别改什么

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

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


http://www.kler.cn/a/307896.html

相关文章:

  • C++ —— 哈希详解 - 开散列与闭散列
  • 什么岗位需要学习 OpenGL ES ?说说 3.X 的新特性
  • CSS多列布局:打破传统布局的束缚
  • C++ 数组与结构 编程练习
  • matlab建模入门指导
  • 使用 Visual Studio Installer 彻底卸载 Visual Studio方法与下载
  • vue part 11
  • string的模拟实现and友元
  • Jacoco的XML报告详解
  • 链动321模式小程序开发源码
  • HTML 和 CSS
  • java项目之基于web的人力资源管理系统的设计与实现(源码+文档)
  • MySQL之安装与基础知识
  • R语言的基础知识R语言函数总结
  • reg和wire的区别 HDL语言
  • chapter14 数据结构与集合源码 知识点总结Note
  • Kotlin 极简小抄 P2(插值表达式、运算符、选择结构赋值)
  • SpringBoot的Web开发支持
  • AG32 MCU的引脚特点及功耗说明
  • 【python数据处理】保存网页
  • C/C++实现植物大战僵尸(PVZ)(打地鼠版)
  • Transformer-Adaboost多输入单输出回归预测神经网络【MATLAB】
  • Alinx MPSoC驱动开发第11章异步IO实验按下按键报IO Possibile后结束进程
  • 【运维】好用的线上项目运维命令
  • ASPICE培训:打造卓越的汽车软件开发能力
  • 比传统机器学习更先进的深度学习神经网络的二分类建模全流程教程