12

私は分析の麻痺で立ち往生していると思います。助けてください!

私は現在、プロジェクトを持っています

私の場合の 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つのセッション/ステートレスセッションを開く戦略を適用し、ビューが破棄されたら、ビューモデルをフラッシュ/セッション/ステートレスセッションを破棄します。

計画のようだ?

4

4 に答える 4

3

私はこれが少し前からのものであることを知っていますが、私は3日間まともな答えをオンラインで探していました。あなたが言及した2つのブログを読んで、Nhibernate 3.0クックブックを見て、MVPアプリケーションでのNhibernateについても説明していますが、これは、リポジトリとNinjectforIoCを使用するMVVMコンテキストに正確には適合しませんでした。

これまでで最も有用なページであるこの古い投稿を見つけました: http ://www.emidee.net/index.php/2010/08/23/ninject-use-one-database-session-per-view -モデル

これが将来この質問に出くわす人に役立つことを願っています。

于 2012-05-15T15:53:41.117 に答える
2

10以上のセッションをアクティブにすることについて、実際にどのような懸念がありますか?セッションは、重量のある操作に使用できる軽量のオブジェクトです。セッションが現在何もしていない場合、それはちょっと重要ではありません。

于 2010-04-09T07:00:21.360 に答える
1

UnitOfWork を使用すると、すべての遅延読み込みが中断されるため、クライアント アプリで深刻な制限が生じます。NHibernate が得意とする部分が失われます。NHibernate モデルには、これらの機能を使用しないように通知するものがないため、実行時例外の設定も行っています。Ayendes のアドバイスは良いと思います。

于 2010-04-09T07:58:12.990 に答える
0

個人的には、セッションを開いたままにしておく時間をできるだけ短くするようにしています。主な理由は、メインの集約ルートで悲観的ロックを使用しているため (ドメイン駆動設計を使用しています)、ロックをできるだけ早く解放したいからです。NHibernate クライアント側を使用しているため、セッションを閉じることができ、新しいセッションを開くと、切断されたエンティティを再接続できることを忘れないでください。

個人的には、一度に多くのウィンドウ/タブが開いているアプリでも、一度に 1 つのセッションしか使用しません。ビューのデータを取得する必要があるとき、または変更を永続化する必要があるときは、新しいものを開きます。

現在のアプリのある時点で、Unit Of Work にマルチセッションのサポートを実装しましたが、それを使用する必要がなく、複雑なことに気付いたときにそれを削除することになりました。

于 2010-07-14T14:52:58.960 に答える