2010-12-30 12 views
2

私はリファクタリングについていくつかの洞察と思考を私は私たちのWebアプリケーションにしようとしている必要があります。モノレール、nhibernateとセッションごとの要求パターン

HttpApplicationのOn_BeginRequest/On_EndRequestを使用して、セッションを作成して破棄することによって、最初にNHibernateおよびActiveRecordで要求ごとのセッションパターンを使用しました。後で、私たちは、DB関連の例外が私たちのモノレールのコンテキストの外に投げ出されたことを認識しました。これは、私たちの救助がうまくいっていないことを意味します。ある場合には望ましいと思われる行動をとることができる。

私たちはBase ControllerのInitialize()/ Contextualize()でセッションを作成するために書き換え、ベースコントローラのDispose()に処分しました。レスキューコントローラのセッションをロールバックして、DBへの半分の書面変更を防止します。ここまでは順調ですね。 Dispose()でそれを行う理由は、セッションを取得する必要があるビューコンポーネントだけでなく、遅延読み込みの理由でビューレンダリングを実行したいからです(セッションの単位作業単位に切り替えることができます)。私は、ロールバックやコミットが得られていないDBでトランザクションを開始したときに、デッドロックの問題が発生しています。 「トンは...主な原因私たちは、このアプローチで作った混乱の、その周りに

を私の頭を取得するだから私は、この記事を見つけました:私たちがそれを使用することができ、フィルタ」、http://hackingon.net/post/NHibernate-Session-Per-Request-with-ASPNET-MVC.aspx

と私は思いましたMonoRailも! "、becそれはBeforeActionとAfterRenderingで使える。

私の質問は、以下のとおりです。

  1. 例外はフィルターで発生した場合はどうなりますか?
  2. アクションまたはレンダリングで例外が発生した場合でもAfterRenderingが発生しますか?
  3. この方法をお勧めしますか?そうでない場合は、代わりにあなたの提案は何ですか?

どのポインタも非常に高く評価されています!

+0

あなたはNHibernate機能を使ってみましたか? –

+0

私たちはActiveRecordFacilityを使用していますが、作成または廃棄されたセッションについてはわからないため、TransactionScopeの方法に慣れていません。私はちょうどsessionFactoryを使用し、必要に応じてセッションを作成する独自のラッパーを持っています。私は、同じラッパーで「要求ごとのセッション」と「作業単位」のパターンを実装できることを期待しています。このシナリオでNHibernateの機能は私を助けますか? – jishi

+0

申し訳ありませんが、ActiveRecordの言及は見られませんでした。はい、ActiveRecordFacilityまたはNHibernateFacilityのいずれかであり、両方ではありません。取引に関しては、自動取引管理機能を試しましたか? –

答えて

1
  1. 例外処理を処理するには、アプリケーションエラーハンドラが必要です。

  2. デバッガを接続して見つけます。

  3. おそらく(私の記事ですが)そうではありません。 RenderActionでは動作しません。 IoCコンテナを使用して接続の有効期間を制御することをお勧めします。

関連する問題