我在我的asp.net核心应用程序中设置了一个中间件,以自动将控制器操作包装在一个事务中.
public async Task Invoke(HttpContext context,MyDataContext dbContext) { if (context.Request.Method == "GET") { await _next(context); } else { using (var transaction = await dbContext.Database.BeginTransactionAsync()) { try { await _next(context); transaction.Commit(); } catch (Exception) { transaction.Rollback(); throw; } } } }
但是我有一个不应该在事务中运行的控制器方法(将来可能更多).让控制器操作“选择退出”中间件功能的最佳方法是什么?
将[NoTransaction]等自定义属性放在控制器方法上会很不错.但是,我无法确定是否有任何方法可以从我的中间件的Invoke()方法中确定将调用哪个控制器操作(这将使我能够从该方法中提取属性并确定是否创建事务.)这样做的正确方法是什么?
解决方法
我认为您正在寻找的是自定义过滤器.
您可以创建一个派生自ActionFilterattribute的新类.
然后,您可以覆盖OnActionExecuting和OnActionExecuted方法以添加事务处理.
然后,您可以将过滤器属性添加到要运行它们的方法中. [CustomFilter],以防您将类命名为“CustomFilterattribute”.
如果需要更多地控制过滤器类的生命周期,可以将ActionFilter用作ServiceFilter.它需要将其注册为服务,并允许您使用依赖注入.
ServiceFilter属性看起来略有不同:
[ServiceFilter(typeof(CustomFilter))]
对此的一个很好的参考是:
https://damienbod.com/2015/09/15/asp-net-5-action-filters/
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。