我要做的是在每个控制器的每个操作方法之后执行await unitOfWork.CommitChanges()
(并且可能返回无效结果以指示发生错误)“每个请求的事务处理”功能。
目前,我已尝试使用自定义AsyncActionInvoker来覆盖EndInvokeActionMethod
并在其中使用.Wait()
方法。我认为它可能会导致问题,而且通常不是一个好方法。此外,我在重写.CommitChanges()
内使用InvokeAction
的同步变体,以使其以相同的方式用于同步操作方法。以下是完整的示例:
public class UnitOfWorkActionInvocker : AsyncControllerActionInvoker, IAsyncActionInvoker, IActionInvoker
{
private IUnitOfWork unitOfWork;
public UnitOfWorkActionInvocker(IUnitOfWork unitOfWork)
{
this.unitOfWork = unitOfWork;
}
public override bool InvokeAction(ControllerContext controllerContext, string actionName)
{
this.unitOfWork.CommitChanges();
return base.InvokeAction(controllerContext, actionName);
}
public override bool EndInvokeAction(IAsyncResult asyncResult)
{
this.unitOfWork.CommitChangesAsync().Wait();
return base.EndInvokeAction(asyncResult);
}
}
我考虑过为此目的使用异步ActionFilter,但它只在WebApi中提供。 Mvc只有同步ActionFilters。
是否可以在EndInvokeAction 异步中调用异步方法?有更好的选择吗?