デスクトップ アプリケーションにおける NHibernate のセッション管理戦略は何ですか?
-
01-07-2019 - |
質問
HttpContext のような明確な結合を利用できないため、デスクトップ アプリケーションでセッションを管理することははるかに難しいと思います。では、アプリケーション全体に対して 1 つのセッションを開かずに、セッションの有効期間を管理して遅延読み込みを利用するにはどうすればよいでしょうか?
解決
それは結局のところ、オブジェクトのデザインにあると思います。遅延読み込みはオブジェクトごとのレベルで強制できるため、セッション管理を考えるときにその事実を利用できます。
たとえば、データが豊富で遅延ロードされるオブジェクトが多数あり、それらのグリッド/概要ビューと詳細ビューがあります。グリッド概要ビューでは、オブジェクトの遅延読み込みバージョンは使用しません。そのデータを表示するためにサロゲート オブジェクトを使用しますが、そのサロゲート オブジェクトは遅延ロードされません。
一方、ユーザーが表示/編集するレコードを選択し、オブジェクトの複数ページの詳細ビューに入ると、その時点で特定のオブジェクトに遅延読み込みが適用されます。どの詳細がオンデマンドでのみ表示されるかに応じて、データが遅延ロードされるようになりました。そうすることで、遅延読み込み用に開かれているセッションのスコープは、詳細ビューが使用されている間のみ持続します。
他のヒント
アイエンデは最近こう書いています MSDN のこのテーマに関する素晴らしい記事.
前に述べたように、HttpRequest の境界を使用することはできませんが、デスクトップ アプリケーションの「HttpRequest」が何であるかを理解することはできます。
説明しましょう。通常、HttpRequest はアクションのコントローラーとなり、セッションをその特定のアクションに制限します。デスクトップアプリケーションでは「コントローラー」(イベント)を小さくすることができますが、@Jonが言ったように、ウィンドウは簡単に境界を表すことができます。そこにあるものを操作し、それらをセッションに加えます。
コマンドパターンのセットアップを考えることができるかもしれません。それぞれの重要なイベントがコマンドを供給してトリガーし、それを実行します。基本の AbstractCommand.Execute() 実装は、セッションの初期化、トランザクションのラップ、具体的な SomeCommand._Execute() 実装の呼び出し、およびすべてのもののクローズを担当します。
とにかく、これは、オブジェクトをロードし、プレーンなインスタンスだけを処理したい(したい)場合のように、永続性に依存しないわけではありません(ここでは特に遅延ロードについて言及しています)。
別の方法で、ある種の自動オープン/自動クローズ動作を実装することは可能ですか?これは、遅延読み込みトリガーなどの暗黙的な場合であっても、永続層を上位層によるクエリのニーズに敏感にすることで実現する必要があります。接続の終了に関しては、DB が非アクティブになってから一定のタイムアウト (10 秒?) が経過すると、永続化レイヤーが終了する可能性があります。わかっていますが、これは鋭くないです。しかし、実際には、上位層が永続性を意識しなくなります。
ありがとう、マルチェロ