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

时间:2016-07-13 08:06:34

标签: filter transactions asp.net-core asp.net-core-mvc entity-framework-core

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

  • 过滤器必须在Authorization Filter之后执行(我没有 想明确使用order
  • 过滤器必须在操作方法内容
  • 之前打开一个事务
  • 如果没有例外,必须提交交易,否则必须 执行动作方法后回滚。

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

    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,并将其放在过滤器管道中。

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

1 个答案:

答案 0 :(得分:0)

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

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