Mvvm 多个ViewModels请求相同的域对象,我是否应该为它们提供相同/不同的实例?

Mvvm 多个ViewModels请求相同的域对象,我是否应该为它们提供相同/不同的实例?,mvvm,domain-driven-design,data-integrity,Mvvm,Domain Driven Design,Data Integrity,这里的新手,如果这是一个明显的问题,很抱歉,我的英语也很抱歉。我试着用谷歌搜索,但没有找到我问题的答案 我只使用Visual Studio、Autofac、EF CTP5代码(可能以后会切换到HHibernate,因为EF CTP5不支持IoC容器),并尝试使用以下模式:MVVM、DI、DDD 我的问题是:当多个ViewModels从存储库请求相同的域对象时,我应该为它们提供相同的实例还是为每个请求创建一个新实例 如果我为每个请求创建一个新实例,我想我会这样写: public class Per

这里的新手,如果这是一个明显的问题,很抱歉,我的英语也很抱歉。我试着用谷歌搜索,但没有找到我问题的答案

我只使用Visual Studio、Autofac、EF CTP5代码(可能以后会切换到HHibernate,因为EF CTP5不支持IoC容器),并尝试使用以下模式:MVVM、DI、DDD

我的问题是:当多个ViewModels从存储库请求相同的域对象时,我应该为它们提供相同的实例还是为每个请求创建一个新实例

如果我为每个请求创建一个新实例,我想我会这样写:

public class PersonRepository
{
    public Person GetById(int id)
    {
        using (var dbContext = new MainDbContext())
        {
            return dbContext.Persons.Where(x => x.Id == id);
        }
    }
}
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;
    }
}
在任何ViewModle修改其域对象实例之后,我必须找到一种方法通知所有其他ViweModels更新其实例,以确保数据完整性

如果我为所有请求提供相同的域对象实例,那么我想我必须编写如下内容:

public class PersonRepository
{
    public Person GetById(int id)
    {
        using (var dbContext = new MainDbContext())
        {
            return dbContext.Persons.Where(x => x.Id == id);
        }
    }
}
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;
    }
}
公共类PersonRepository
{
列表_cache=新列表();
公众人物GetById(内部id)
{
var person=getFromCache(id);
if(person==null)
{
person=getFromDatabase(id);
_cache.Add(人);
}
返回人;
}
}
我还需要找到一种方法,在任何ViewModels都不需要实例时(或在缓存中使用weakreference)从缓存中删除实例,以避免内存泄漏

我该走哪条路?我有更好的选择吗

谢谢

编辑:更改内容以获得更好的描述

(对不起我的英语)

更新


在我对此做了一些研究之后,我意识到这个问题太令人困惑了,所以我在这里发布了一个新问题:

如果您考虑的是由于多个用户而产生的多个实例,那么您可能希望实例化一个视图模型实例,并了解如何使用您的ORM和数据库执行此操作,这需要理解。这里有一个链接,虽然我个人使用NHibernate。我还建议您更喜欢乐观锁定

如果您谈论的是同一个领域对象(例如,person)的多个视图和一个用例,那么您可能需要不同的视图模型,尽管可以使用同一视图模型的多个实例。无论如何,这里的同步都不是数据库的责任。这是一个例子

HTH,
贝里尔


另外,我刚看到你在存储库中缓存东西。虽然这是一个很好的考虑因素,但您最好将缓存管理留给您的ORM(即EF、NHibernate),然后了解如何在必要时对其进行微调。例如,NHib的默认行为将在典型场景中进行智能和适当的缓存。

您好,感谢您的详细回复和链接!我现在要研究你提到的主题。