2012-03-13 16 views
3

ORMとの組み合わせでマスター詳細ビューを最適に実装する方法がわかりません。 アプリケーションは、MVVMでWPFを使用し、現在選択されているオブジェクトの詳細だけでなく、使用可能なすべてのオブジェクトのグリッドを表示します。 ItemViewModelは、ビュー内の表示手段であるべきドメインオブジェクトのViewModelにあるORM、作業単位およびリポジトリパターンと組み合わせたマスター - 詳細ビュー

  • ObservableCollection<ItemViewModel> Itemsを:

    ビューのViewModelには、それが持っている、非常に単純です。このプロパティはグリッドにバインドされています。

  • グリッドのSelectedItemにバインドされItemViewModel CurrentItemプロパティ。 「選択した項目を削除」と「選択したアイテムへの変更を保存」、「新しい項目の追加」の
  • ICommand

私のアプリケーションはそのORMツールとしてNHibernateはを使用していますが、私はそう、私は「作業単位」と「リポジトリ」のパターンを使用して、それを抽象化コードベース全体でNHibernateはをリークする必要はありません。

これらのパターンのNHibernate固有の実装は、「Unit of Work」が新しいNHibernateセッションを開き、トランザクションが開始時と終了時にトランザクションをコミットし、セッションを処分するようなものです。したがって、作業単位、セッション、およびトランザクションの存続期間は同じです。作業ユニットは、作業ユニットと同じセッションを使用しており、同じ寿命を持つプロパティーRepositoryを持っています。

ここで問題が発生しています。 MasterDetailViewModelのコンストラクタにItemsコレクションを移入したいとします。現在、私は新しい作業ユニットを作成してコレクションに移入する必要があります。トランザクションが長期間実行されないようにするために、UoWは直後に処理され、基礎となるセッションも破棄されます。

現在、ユーザーが現在のアイテムの変更を保存したい場合、別のUoWを開き、データベースからエンティティを取得し、ItemViewModelの現在の値で更新し、データベースに保存して処分する必要がありますうわー。
しかし、このアプローチは、いくつかの重要なドローバックを持っています

  1. 私のコードはusing(var uow = uowFactory.StartNew())が散らばっています。
  2. 楽観的なロックが行われていません。他の誰かがデータベース内の同じアイテムを変更してしまった場合、その変更は黙って上書きされます。
  3. 項目を1つではなく更新するには、2つのデータベースヒットが必要です。

これは私のUoWの実装に欠陥があるという結論につながります。

私はUOWとリポジトリとの間の関係が逆転するように実装を変更することを考えました。これは、IoCがUnitOfWorkFactoryではなくViewModelにリポジトリを挿入することを意味します。リポジトリは、NHibernateのISessionと機能的に同等です。リポジトリは、データベーストランザクションと同じ新しいUoWを開始することができます。
これは私のマスター/詳細シナリオにはうまくいくが、通常は作業単位の同義語として使用される「ビジネストランザクション」の概念をサポートしていない。複数のデータベーストランザクションとユーザー要求にまたがる論理トランザクション。

質問です:最高の両方のシナリオで使用できるように仕事とリポジトリの二つのパターンのユニットを実装する方法は?

+0

見ます表示されている項目を参照)、各業務オペレーション "新規追加"、 "変更"などの周りのtransaction.Begin()、transaction.Commit()を使用します。 – Firo

+0

@Firo:この場合、長期間のセッションが良いことであることを私に保証してくれてありがとう。 –

答えて

0

あなたは、必ずしもその粒度を変更しない業務トランザクションを開始する場所を変更します。新しいUOWの開始より細かワイズそんなに違う、私は完全にあなたの例を得るが、リポジトリのメソッド(それは永続ストアを照会するたび)のそれぞれに新しいUOWを開始どのように私は見ることができない

わかりませんMasterDetailViewModelがその項目にデータを入力したとき、および項目の1つが保存されるたびに別の項目が読み込まれます。

はしかし、あなたが提案するように私はUOWがリポジトリ性質を持っているため、それは奇妙に思えるので、のViewModel自体にリポジトリを注入う - UOWは、直接リポジトリを操作していない、それはむしろ使用し、いくつかのオブジェクトですリポジトリは、 aoWのコンテキストです。それ以外

は、私はあなたはかなり短命、きめ細かなビジネス取引に関連した欠点を釘付けと思います。あなたはそれについて多くを行うことはできません。

他にもたくさんのセッション戦略があります。このarticleにいくつかの提案があります。

はまた、私は抽象化を使用していないが、私の周りのフレームを除いて(もうグリッドを移入し、表示されていないすべての項目を追い出す長時間実行セッションを開いた

What is your session management strategy for NHibernate in desktop applications?

What should be the lifetime of an NHibernate session?

関連する問題