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

王柳  论坛元老 | 2024-9-20 23:16:13 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1911|帖子 1911|积分 5733

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
想用一个过滤器实现特定接口的审核日志记载,效果报了错,看了看感觉有些底子要补,所以想记载下来
错误:

在属性过滤器中使用了依靠注入,效果在应用在控制层接口时报了传参的错
  1. //过滤器
  2. public class AuditRecordFilter: ActionFilterAttribute
  3. {
  4.     private readonly ISysAuditRecordService _sysAuditRecordService; // 注入日志服务
  5.     /// <summary>
  6.     /// 会话管理接口
  7.     /// </summary>
  8.     private readonly TokenManager _tokenManager;
  9.     public AuditRecordFilter( ISysAuditRecordService sysAuditRecordService, TokenManager tokenManager)
  10.     {
  11.         _sysAuditRecordService = sysAuditRecordService;
  12.         _tokenManager = tokenManager;
  13.     }
  14. ...
复制代码
控制层:


缘故原由:

ASP.NET Core 框架中的生命周期管理服务解析机制。
在 ASP.NET Core 中,依靠项是通过依靠注入容器(DI容器)来解析的。这个容器会自动为必要依靠的对象(如服务、仓储等)提供相应的实例。
理论上,这些依靠应该由 ASP.NET Core 的 DI 容器注入。但是,假如你直接在控制器方法上使用属性形式的 [AuditRecordFilter],由于它是编译时静态定义的,框架不会通过依靠注入自动解析这些服务。这就是为什么在使用某些属性过滤器时,会有依靠项无法解析的错误。
ASP.NET Core 的属性过滤器(例如 [AuditRecordFilter])在编译时就已经创建。也就是说,过滤器实例在 ASP.NET Core 依靠注入容器有机会参与之前就已经被创建,因此 DI 容器无法为过滤器的构造函数注入依靠项。这导致你看到的错误提示,表明无法解析 ISysAuditRecordService 等依靠。
错误的缘故原由是: 使用属性过滤器时,过滤器实例化发生在编译时,而非运行时,框架不会自动为这些属性过滤器提供依靠项。

解决方案:

改为使用TypeFilter 或 ServiceFilter
二者实现的区别


这里我用了TypeFilter ,在具体的过滤器中不必要特殊改什么
  1. //控制层接口标注
  2.  [TypeFilter(typeof(AuditRecordFilter),Arguments =new object[] {3})]
复制代码
此中的Arguments可用过滤器的构造函数拿到,这个可做接口区别判断之类的功能,更灵活一些 。





























免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

王柳

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表