4

在我的 System.Web.Mvc 操作过滤器中,我以前使用 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.HttpWeb Api 操作过滤器(使用HttpActionContext)中 - 是否有一个等效的位置来存储我的服务实例,所以我可以在执行操作时检索相同的实例?

4

1 回答 1

21

在 System.Web.Http Web Api 操作过滤器(使用 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();
    }
}
于 2013-02-17T12:25:00.017 回答