Jam*_*Orr 5 asp.net-core asp.net-core-middleware
我在我的 asp.net core 应用程序中设置了一个中间件,以自动将控制器操作包装在事务中。
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;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是,我有一种控制器方法(将来可能会有更多)不应在事务中运行。让控制器操作“选择退出”中间件功能的最佳方法是什么?
在控制器方法上放置一个像 [NoTransaction] 这样的自定义属性会很好。但是,我无法确定是否有任何方法可以从中间件的 Invoke() 方法中准确解析将调用哪个控制器操作(这将使我能够从该方法中提取属性并确定是否创建事务.) 正确的方法是什么?
小智 2
我认为您正在寻找的是自定义过滤器。
您可以创建一个派生自 ActionFilterAttribute 的新类。然后,您可以重写 OnActionExecuting 和 OnActionExecuted 方法来添加事务处理。
然后,您可以将过滤器 via 属性添加到要运行它们的方法中。[CustomFilter]如果您将类命名为“CustomFilterAttribute”。
如果您需要对过滤器类的生命周期进行更多控制,您可以使用 ActionFilter 作为 ServiceFilter。它需要将其注册为服务,并且还允许您使用依赖项注入。ServiceFilter 属性看起来略有不同:
[ServiceFilter(typeof(CustomFilter))]
Run Code Online (Sandbox Code Playgroud)
一个很好的参考是: https://damienbod.com/2015/09/15/asp-net-5-action-filters/
| 归档时间: |
|
| 查看次数: |
2611 次 |
| 最近记录: |