2011-02-10 32 views
0

初心者ここ、申し訳ありませんが、これは明らかな質問であり、私の英語には申し訳ありません。私はGoogleに挑戦しましたが、私の質問に対する答えは見つかりませんでした。同じ/異なるインスタンスを複数のViewModelが同じドメインオブジェクトに要求する必要がありますか?

私はVisual Studio、Autofac、EF CTP5コードのみを使用しています(EF CTP5はIoCコンテナをサポートしていないため、後でHHibernateに切り替えることがあります)、MVVM、DI、DDDのパターンを使用しようとしています。

私の質問は:複数のViewModelが同じドメインオブジェクトをリポジトリから要求した場合、それらのインスタンスに同じインスタンスを渡すか、リクエストごとに新しいインスタンスを作成する必要がありますか?

私はリクエストごとに新しいインスタンスを作成した場合、私はこのような何か書くと思います:

public class PersonRepository 
{ 
    public Person GetById(int id) 
    { 
     using (var dbContext = new MainDbContext()) 
     { 
      return dbContext.Persons.Where(x => x.Id == id); 
     } 
    } 
} 

をし、任意のViewModleは、ドメイン・オブジェクトのそのインスタンスを変更した後、私は方法を見つける必要がありますすべての他のViweModelにインスタンスを更新するように通知して、データの整合性を確保します。

私はすべての要求のためのドメイン・オブジェクトの同じインスタンスを与えた場合、私はこのような何かを書かなければならないだろうと思います。

public class PersonRepository 
{ 
    List<Person> _cache = new List<Person>(); 
    public Person GetById(int id) 
    { 
     var person = getFromCache(id); 
     if (person == null) 
     { 
      person = getFromDatabase(id); 
      _cache.Add(person); 
     } 
     return person; 
    } 
} 

そして私もからインスタンスを削除する方法を見つける必要がありますいずれかのViewModelで必要とされないとき(またはキャッシュの弱参照を使用するとき)にキャッシュを使用して、メモリリークを回避します。

どのようにすればいいですか?より良い選択肢がありますか?

ありがとうございます!

編集:内容を変更するために内容が変更されました。

(私の英語のため申し訳ありません)

更新

私はこの上でいくつかの研究をした後、私はこの質問があまりにも混乱して実現ので、私はここで新しい質問投稿:Multiple ViewModels modify the same domain object

答えて

0

複数のユーザーが原因で発生する複数のインスタンスについて考えている場合は、1つのビューモデルインスタンスをインスタンス化し、ORMとデータベースを使用してこれを行う方法についてのハンドルを取得することが考えられます(optimistic v pessimistic locking)。私は個人的にNHibernateを使っていますが、ここにはinformation on how EF supports thisというリンクがあります。また、オプティミスティックロックを使用することをお勧めします。

ユースケースを持つ同じドメインオブジェクト(つまり人物)の複数のビューについて言えば、同じビューモデルの複数のインスタンスを使用することは可能ですが、異なるビューモデルが必要になる可能性があります。いずれにしても、ここでの同期はデータベースの責任ではありません。ここにはgood link that explores various possibilities with a bias towards an event aggregatorがあります。

HTH、
Berryl

P.S.ちょうどあなたのリポジトリ内のものをキャッシングしているのを見ました。これは素晴らしい検討事項ですが、ORM(つまりEF、NHibernate)にキャッシュ管理を任せておき、必要に応じて微調整する方法を理解することが最善です。たとえば、NHibのデフォルト動作は、典型的なシナリオではインテリジェントかつ適切にキャッシュされます。

+0

こんにちは、詳細な返信とリンクありがとう!私はあなたが今述べたトピックを研究するつもりです。 –

関連する問題