如何为事务管理编写自定义过滤器

Posted

技术标签:

【中文标题】如何为事务管理编写自定义过滤器【英文标题】:How to write custom filter for transaction management 【发布时间】:2016-11-15 16:52:58 【问题描述】:

我想使用过滤器来管理具有以下要求的事务。

过滤器必须在Authorization Filter(我不知道 想明确使用order) 过滤器必须在操作方法内容之前打开事务 无异常则必须提交事务,否则必须提交 执行 action 方法后回滚。

我认为的过滤器实现如下:

    private IDbContextTransaction _tx;

    private readonly MyDbContext _dbContext;

    public override void OnActionExecuting(ActionExecutingContext actionContext)
    
        _tx = _dbContext.Database.BeginTransaction();
    

    public override void OnActionExecuted(ActionExecutedContext context)
    
        if (context.Exception == null)
        
            _tx.Commit();
        
        else
        
            _tx.Rollback();
        
    

然后我想将它用于以下命令操作:

    [HttpPost]
    [Command]
    public IActionResult Create([FromBody] CreateTodoCommand cmd)
    
    

根据文档:

资源过滤器是处理请求后的第一个过滤器 授权,最后一个在请求离开时触摸请求 过滤器管道。它们对于实现缓存或 否则出于性能原因将过滤器管道短路。

在我的情况下使用它似乎是可行的。如果没有其他解决方案,我会选择这个。另一方面,我想尝试编写自己的自定义过滤器类型,例如Authorization Filter,并将其放入过滤器管道中。

问题:如何实现自定义过滤器?

【问题讨论】:

您是否考虑过插入自定义中间件? @DrSchizo 是的,我认为但在我的情况下使用中间件是不可行的(我认为是这样)。因为事务仅针对具有Command 属性的命令操作(我将更新我的问题)。 我不确定你是否可以为此目的使用 AuthorizationFilter,因为它只在传入请求而不是传出响应上执行(但我不确定我是否正确,因为你可以写一个continuation 当使用 await 和 IAsyncAuthorizationFilter)。同样的方式结果过滤器的OnResourceExecuted 将在响应写入客户端后执行,所以我不确定你是否同意。如果我们把所有这些都放在一边,理想情况下,您希望交易窗口很小,而不是环绕多层。 此外,您还需要处理异常情况和回滚 @KiranChalla 我不想使用AuthorizationFilter,我想使用任何过滤器,就像它的顺序一样(在所有过滤器之前)。您对Resource Filter 是对的,这对我的情况似乎不可行(我误解了它)。在这种情况下,似乎我唯一的选择是在过滤器构造函数中使用Action Filter 并设置顺序(可能是-1000)。谢谢。 【参考方案1】:

您可以创建自定义属性并将其设置为您的操作。

using Microsoft.AspNetCore.Mvc.Filters;
    public class CustomActionFilter: Attribute, IActionFilter 
            public void OnActionExecuting(ActionExecutingContext context) 
    
    

【讨论】:

以上是关于如何为事务管理编写自定义过滤器的主要内容,如果未能解决你的问题,请参考以下文章

如何为 AVD 管理器创建自定义 Android 设备配置文件?

如何为 Django 对象创建自定义过滤器标签?

如何为我的 IDE 编写/引用易于管理的 PHP 可调用函数

如何为来自相关模型的聚合数据实现自定义 django 过滤器

使用 PyQT,如何为带有自定义列表的 QComboBox 过滤 mousePressEvent

如何为spring数据编写自定义模块