私は分析の麻痺で立ち往生していると思います。助けてください!
私は現在、プロジェクトを持っています
- SQLite で NHibernate を使用
- リポジトリと作業単位パターンを実装: http://www.nhforge.org/wikis/patternsandpractices/nhibernate-and-the-unit-of-work-pattern.aspx
- WPF アプリでの MVVM 戦略
私の場合の Unit of Work 実装は、一度に 1 つの NHibernate セッションをサポートします。当時、これは理にかなっていると思いました。ViewModel から NHibernate セッションの内部動作を隠します。
現在、Oren Eini (Ayende) によると: http://msdn.microsoft.com/en-us/magazine/ee819139.aspx
彼は、プレゼンター/ビューモデルに関連付けられたビューが破棄されるときに、NHibernate セッションを作成/破棄する必要があることを聴衆に納得させます。彼は、Windows アプリごとに 1 つのセッションを必要としない理由や、トランザクションごとにセッションを作成/破棄したくない理由を示しています。残念ながら、私の UI ではアプリに 10 個以上のビュー/ビューモデルが存在する可能性があるため、これは問題を引き起こします。彼は MVP 戦略を使用してプレゼンテーションを行っていますが、彼のアドバイスは MVVM に変換されますか?
これは、作業単位を廃止し、viewmodel に NHibernate セッションを直接作成させる必要があるということですか? WPF アプリは一度に 1 つの作業セッションのみを持つべきですか? それが本当なら、いつNHibernateセッションを作成/破棄する必要がありますか?
そして、NHibernate Stateless セッションがこれらすべてにどのように適合するかはまだ考えていません! 私の脳は爆発するつもりです。助けてください!
アップデート:
Rhino Tools で Ayende の Unit of Work 実装を見つけました。彼の実装と私が行った実装には大きな違いがあることがわかりました。彼は間違いなく複数のセッションをサポートしました。さらに調査した結果、次のことを行うのが最善だと思います。
- Unit of Work の実装を破棄する
- viewmodel から直接 NHibernate の ISession および IStatelessSession オブジェクトを使用することをやめます。私の意見では、それは理想的ではありませんが、私はすでに Unit of Work に多くの時間を費やしており、それが現在の形になっているわけではありません。ある時点で KISS と YAGNI を適用する必要があります。Ayende の記事や他のいくつかの記事で、それらを直接使用しても問題ないと指摘されているという事実に、少なくとも慰めを得ることができます。
- 本当に ISession を公開したくない場合は、いつでも Castle.ActiveRecord を使用できますが、それは必要ではないと思います。
- セッション ファクトリのコードを再利用できるので、Unit of Work の実装は無駄ではありません。
- StatelessSession と Session の両方を挿入できるようにリポジトリをリファクタリングし、利用可能な場合はステートレスを使用します。それ以外の場合は通常のセッションを使用します。
結局のところ、ビューモデルごとに1つのセッション/ステートレスセッションを開く戦略を適用し、ビューが破棄されたら、ビューモデルをフラッシュ/セッション/ステートレスセッションを破棄します。
計画のようだ?