0

を開始するカスタム ActionFilterAttribute を使用していますNHibernate Session.Transaction

ActionExceutedContextトランザクションコミットの実行を回避し、代わりにロールバックを呼び出すために、いつ例外がアクションで処理されるのか、どうすればそれを取得できるのか疑問に思っていました。例外が処理されない場合は正常に機能します。処理されたもののための方法が必要です。例外を処理するすべての場所で、ロールバックを書きたくありません。

 public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        _transactionHelper.BeginTransaction();
        base.OnActionExecuting(filterContext);
    } 


public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        if (filterContext.Exception == null)
            _transactionHelper.Commit();

        base.OnActionExecuted(filterContext);
    }
4

1 に答える 1

0

元の例外をラップする catch ブロックで新しい例外をスローできます。

try
{
    var x = 1 / 0;
}
catch (DivideByZeroException ex)
{
    // handle and allow transaction to commit
}
catch(Exception ex)
{
    // handle and throw new exception so that transaction is rolled back in filter
    throw new ExceptionCaughtInActionException(ex); // custom exception wrapper
}

このアプローチでは、フィルターでログを記録することもできます。ただし、アクションメソッドでトランザクションを処理する方が良いと思います。繰り返しになる可能性がありますが、はるかに読みやすく、トランザクション境界をより適切に制御できることがわかりました。

于 2013-01-31T14:47:25.557 に答える