首页 文章

Web API动作过滤器 - Controller.TempData等效?

提问于
浏览
4

在我的System.Web.Mvc Action过滤器中,我以前使用TempData来存储我的unitOfWork服务的实例,如下所示:

public override void OnActionExecuting(ActionExecutingContext filterContext)
{
    filterContext.Controller.TempData[UnitOfWorkRequestKey] = UnitOfWork;
    UnitOfWork.Begin();
}

然后提交事务我从像这样的临时数据中检索它 .

public override void OnActionExecuted(ActionExecutedContext filterContext)
{
    var unitOfWork = (IUnitOfWork)filterContext.Controller.TempData[UnitOfWorkRequestKey];
    try
    {
        if (filterContext.Exception == null)
        {
            unitOfWork.Complete();
        }
    }
    finally
    {
        unitOfWork.Dispose();
        filterContext.Controller.TempData[UnitOfWorkRequestKey] = null;
    }
}

所以我的问题是:
System.Web.Http Web Api Action Filter中(使用 HttpActionContext ) - 是否有一个等效的位置来存储我的服务实例,所以我可以在执行操作时检索相同的实例?

1 回答

  • 19

    在System.Web.Http Web Api Action Filter中(使用HttpActionContext) - 是否有一个等效的位置来存储我的服务实例,所以我可以在执行操作时检索相同的实例?

    不,没有 . API的重点在于它应该是无状态的 . 这是规则编号1.如果您需要在API中使用Session或TempData,您可能从设计角度做了一些非常错误的事情 .

    此外,您不应该在MVC应用程序中使用TempData来完成此任务 . 当您需要在多个请求之间保留信息时,将使用TempData . 在您的情况下,它是相同的请求 . 所以你应该使用 HttpContext 来存储这些信息:

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        filterContext.HttpContext.Items[UnitOfWorkRequestKey] = UnitOfWork;
    }
    

    然后:

    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        var unitOfWork = (IUnitOfWork) filterContext.HttpContext.Items[UnitOfWorkRequestKey];
        try
        {
            if (filterContext.Exception == null)
            {
                unitOfWork.Complete();
            }
        }
        finally
        {
            unitOfWork.Dispose();
            filterContext.Controller.TempData[UnitOfWorkRequestKey] = null;
        }
    }
    

    好了,既然我们已经修复了你的MVC应用程序,那么如何使用 Request.Properties 集合在Web API中实现相同的功能:

    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        actionContext.Request.Properties[UnitOfWorkRequestKey] = UnitOfWork;
    }
    

    然后:

    public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
    {
        var unitOfWork = (IUnitOfWork) actionExecutedContext.Request.Properties[UnitOfWorkRequestKey];
        try
        {
            if (actionExecutedContext.Exception == null)
            {
                unitOfWork.Complete();
            }
        }
        finally
        {
            unitOfWork.Dispose();
        }
    }
    

相关问题