如何为事务管理编写自定义过滤器
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 设备配置文件?
如何为我的 IDE 编写/引用易于管理的 PHP 可调用函数
如何为来自相关模型的聚合数据实现自定义 django 过滤器