1

ここの初心者、これが明白な質問である場合は申し訳ありません。また、私の英語で申し訳ありません。Google を試しましたが、質問に対する回答が見つかりませんでした。

私は 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 がドメイン オブジェクトのインスタンスを変更した後、データの整合性を確保するために、他のすべての ViewModel にインスタンスを更新するよう通知する方法を見つける必要があります。

すべてのリクエストに対してドメイン オブジェクトの同じインスタンスを指定する場合、次のように記述する必要があると思います。

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 でインスタンスが必要ない場合 (またはキャッシュに weakreference を使用する場合) にキャッシュからインスタンスを削除する方法を見つける必要もあります。

どちらに行けばいいですか?より良いオプションはありますか?

ありがとう!

編集:より良い説明のために内容を変更しました。

(私の英語でごめんなさい)

更新

これについて調査した後、この質問がわかりにくかったので、ここに新しい質問を投稿しました: Multiple ViewModels modify the same domain object

4

1 に答える 1

0

複数のユーザーが原因で発生する複数のインスタンスについて考えている場合は、1 つのビュー モデル インスタンスをインスタンス化し、ORM とデータベースを使用してこれを行う方法を理解する必要があります。これには、楽観的ロックと悲観的ロックの理解が必要です。個人的には NHibernate を使用していますが、EF がこれをどのようにサポートしているかについての情報があるリンクを次に示します。また、楽観的ロックを好むこともお勧めします。

ユース ケースで同じドメイン オブジェクト (つまり、人) の複数のビューについて話している場合、同じビュー モデルの複数のインスタンスを使用することは可能ですが、異なるビュー モデルが必要になる可能性があります。いずれにせよ、ここでの同期はデータベースの責任ではありません。これは、イベントアグリゲーターに偏ったさまざまな可能性を探る良いリンクです

HTH、
ベリル

PSちょうどあなたがあなたのリポジトリに物をキャッシュしているのを見ました. これは優れた考慮事項ですが、キャッシュ管理を ORM (つまり、EF、NHibernate) に任せ、必要に応じて微調整する方法を理解することをお勧めします。たとえば、NHib の既定の動作は、一般的なシナリオでインテリジェントかつ適切にキャッシュされます。

于 2011-02-11T20:32:12.013 に答える