Фильтр действий Web API - эквивалент Controller.TempData?
В моих фильтрах действий 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.Http
Фильтр действий Web Api (используя HttpActionContext
) - есть ли эквивалентное место для хранения моего экземпляра службы, чтобы я мог получить тот же экземпляр после выполнения действия?
1 ответ
В System.Web.Http Web Api Action Filter (с использованием HttpActionContext) - есть ли эквивалентное место для хранения моего экземпляра службы, чтобы я мог получить тот же экземпляр после выполнения действия?
Нет, нет Весь смысл API в том, что он не должен иметь состояния. Это правило номер 1. Если вам нужно использовать Session или TempData в API, вы, вероятно, делаете что-то очень неправильное с точки зрения дизайна.
Также вам не следует использовать TempData в вашем приложении MVC для этой задачи. 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, вот как можно добиться того же в Web API, используя Request.Properties
коллекция:
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();
}
}