Фильтр действий 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();
    }
}
Другие вопросы по тегам