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 に答える