gpt4 book ai didi

c# - Web API 操作过滤器 - Controller.TempData 等效?

转载 作者:太空狗 更新时间:2023-10-29 23:58:13 27 4
gpt4 key购买 nike

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

最佳答案

In the System.Web.Http Web Api Action Filter (using HttpActionContext) - is there an equivalent location to store my instance of a service, so I can retrieve the same instance when the action has executed?

不,没有。 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();
}
}

关于c# - Web API 操作过滤器 - Controller.TempData 等效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14921041/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com