18

私は、NHibernate でのセッション管理の問題を解決しようと、かなりの時間を費やしています。私の問題の多くは、IoC と AOP の概念に関する知識が不足しているためだと思います。少なくとも、ファビオ・マウロが私に指示し続けているところから、私はそう考えています。

とにかく、私の問題は、「取得」呼び出しを行い、結果をグリッドにバインドする勝利フォーム アプリケーションがあることです。バインド後、ユーザーはある種の「書き込み」アクションを実行できますが、その結果、使用コンセプトごとにセッションを使用しようとして、書き込み後にセッションが閉じられます。次に、ユーザーがグリッドをスクロールすると、遅延読み込みが開始され、セッションが閉じられ、例外が発生します。

ビューにセッションを認識させたくありません。ユーザーがフォームを閉じたときに KillAllSessions を送信したくありません。さらに、ユーザーはいつでも複数のフォームを開いている可能性があり、その方法に関連する問題がさらに複雑になります。私は本質的に、これらすべてが「舞台裏」で機能することを望んでいます。

したがって、これまでの私の考えは、遅延読み込み呼び出しをインターセプトし、セッションが開いているかどうかを確認し、再度開いていない場合は情報を取得してから再度閉じることです。ただし、私が知る限り、これは大したことではありませんが、基本的には遅延読み込みがどのように機能するかです。これはプロキシ ファクトリ (NHibernate.Bytecode.Castle) によってインターセプトされ、セッションを使用してデータを取得します。したがって、実際にその呼び出しをインターセプトし、セッションを再度開いた後、元の意図したインターセプトに渡す必要があります。それが私の考えです。

私の質問は基本的にまず第一に、これはこれを行う正しい方法ですか? 第二に、どこから始めればよいかさえわかりません。メソッド呼び出しのインターセプトを行ったことはありません。理論的には知っていましたが、実際には知りませんでした。Rhino Commons など、この種のことを行うライブラリがあることは知っていますが、この機会に学び、より優れたプログラマーになりたいと考えています。私は AOP と Context Bound Objects を理解しようとしていますが、現在は理解していません。あなたの何人かが男を助けてくれませんか?

4

2 に答える 2

8

いくつかのオプションを考えることができます:

オプション 1: ユーザーがデータを操作している間は元の ISession を開いたままにし、ユーザーの操作が完了したらすべての変更を一度にコミットします。これは、コミットされていない変更がメモリ内に多数ある可能性があり、他のユーザーが保留中の変更を確認できないことを意味します。

オプション 2: 操作を 2 つの作業単位 (UOW) に分割します。UOW1 は読み取りのみを行い、リストへの入力を担当します。UOW1 に関連付けられた ISession は、ドリルダウン シナリオなどでの遅延読み込みを可能にするためにアクティブなままです。UOW2 は、ユーザーの編集用に作成された、有効期間が短い新しい ISession です。編集がコミットされると、元のオブジェクトは UOW1 から削除され、UOW1 はデータベースから新しいコピーを取得します。

オプション 3: 編集がコミットされるたびにリストを再作成します。これは最も簡単な解決策であり、小さなデータ セットに適している場合があります。

于 2009-06-23T23:29:48.673 に答える
2

私は同様のアプリケーションに取り組んでいます。開いたままにしている 1 つのセッションを使用しています。

データベースに書き込むときはいつでも、基礎となるセッションを閉じないbegin/commitトランザクションを使用します。データベース接続は、トランザクションの進行中に NHibernate によってのみ開かれます。

ユーザーがアクティブにフォームを使用している間、セッションを閉じる必要がある理由はありますか?

セッション、リポジトリ パターンなどを管理するために使用しているものについて、詳細を教えていただけますか?

于 2009-06-25T14:17:24.013 に答える