【发布时间】: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)。谢谢。
标签: filter transactions asp.net-core asp.net-core-mvc entity-framework-core