jon*_*nho 4 c# asp.net-mvc-4 asp.net-web-api
在我的System.Web.Mvc Action过滤器中,我以前使用TempData来存储我的unitOfWork服务的实例,如下所示:
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
filterContext.Controller.TempData[UnitOfWorkRequestKey] = UnitOfWork;
UnitOfWork.Begin();
}
Run Code Online (Sandbox Code Playgroud)
然后提交事务我从像这样的临时数据中检索它.
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;
}
}
Run Code Online (Sandbox Code Playgroud)
所以我的问题是:
在System.Web.Http
Web Api Action Filter(使用HttpActionContext
)中 - 是否有一个等效的位置来存储我的服务实例,所以我可以在执行该操作时检索相同的实例?
Dar*_*rov 20
在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;
}
Run Code Online (Sandbox Code Playgroud)
然后:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
好了,既然我们已经修复了你的MVC应用程序,那么如何使用Request.Properties
集合在Web API中实现相同的功能:
public override void OnActionExecuting(HttpActionContext actionContext)
{
actionContext.Request.Properties[UnitOfWorkRequestKey] = UnitOfWork;
}
Run Code Online (Sandbox Code Playgroud)
然后:
public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
{
var unitOfWork = (IUnitOfWork) actionExecutedContext.Request.Properties[UnitOfWorkRequestKey];
try
{
if (actionExecutedContext.Exception == null)
{
unitOfWork.Complete();
}
}
finally
{
unitOfWork.Dispose();
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
9585 次 |
最近记录: |