多个ViewModels请求相同的域对象,我应该给它们相同/不同的实例吗?

时间:2011-02-10 22:01:31

标签: mvvm domain-driven-design data-integrity

新手在这里,对不起,如果这是一个明显的问题,对不起我的英语。我试过谷歌,但没有找到我的问题的答案。

我只使用Visual Studio,Autofac,EF CTP5代码(可能稍后将切换到HHibernate,因为EF CTP5不支持IoC容器),并尝试使用以下模式: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

1 个答案:

答案 0 :(得分:0)

如果您正在考虑因多个用户而出现的多个实例,您可能希望实例化一个视图模型实例,并使用您的ORM和数据库来处理如何执行此操作,这涉及了解optimistic v pessimistic locking 。这是一个information on how EF supports this的链接,虽然我个人使用NHibernate。我还建议您更喜欢乐观锁定。

如果您正在讨论具有用例的同一域对象(即人)的多个视图,您可能需要不同的视图模型,尽管它可以使用相同视图模型的多个实例。无论哪种方式,这里的同步都不是数据库的责任。这是一个good link that explores various possibilities with a bias towards an event aggregator

HTH,
Berryl

P.S。刚看到你在存储库中缓存了一些东西。虽然这是一个很好的考虑因素,但最好将缓存管理留给ORM(即EF,NHibernate),然后了解如何在必要时对其进行微调。例如,NHib的默认行为将在典型情况下智能且适当地缓存。