Filter 如何编写用于事务管理的自定义筛选器

Filter 如何编写用于事务管理的自定义筛选器,filter,transactions,asp.net-core,asp.net-core-mvc,entity-framework-core,Filter,Transactions,Asp.net Core,Asp.net Core Mvc,Entity Framework Core,我想使用过滤器来管理具有以下要求的事务 筛选必须在授权筛选之后执行(我不知道) 要明确使用订单) 筛选器必须在操作方法内容之前打开事务 如果没有例外,则必须提交交易,否则必须提交 在执行操作方法后回滚 我认为过滤器实现如下所示: private IDbContextTransaction _tx; private readonly MyDbContext _dbContext; public override void OnActionExecuting(Acti

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

  • 筛选必须在授权筛选之后执行(我不知道) 要明确使用
    订单
  • 筛选器必须在操作方法内容之前打开事务
  • 如果没有例外,则必须提交交易,否则必须提交 在执行操作方法后回滚
我认为过滤器实现如下所示:

    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)
    {
    }
根据文件:

资源筛选器是处理请求之后的第一个筛选器 授权,以及在请求离开时最后一个触摸请求的权限 过滤管道。它们对于实现缓存或缓存特别有用 否则,出于性能原因,应短路过滤器管道

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


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

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

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

不过,你有没有想过插入自定义中间件?@DrSchizo是的,我想,但在我的情况下,使用中间件是不可行的(我想是的)。因为事务仅用于具有
command
属性的命令操作(我将更新我的问题)。我不确定您是否可以为此使用AuthorizationFilter,因为它仅在传入请求上执行,而不在传出响应上执行(但我不确定我在这里是否正确,因为在使用wait with
IAsyncAuthorizationFilter
时,您可以编写一个
延续
).Result filter的
OnResourceExecuted
在将响应写入客户端后将以同样的方式执行,因此我不确定您是否同意这一点。如果我们将所有这些放在一边,理想情况下您希望事务窗口较小,而不是环绕多个层。此外,您还需要注意异常情况滚滚back@KiranChalla我不想使用
AuthorizationFilter
,我想使用任何过滤器,就像它的顺序一样(在所有过滤器之前)。你对
资源过滤器是正确的
它对我的情况似乎不可行(我误解了它)。在这种情况下,我唯一的选择似乎是在筛选器构造函数中使用设置顺序(可能是-1000)的
操作筛选器
。谢谢。