1

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

我只使用 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

4

1 回答 1

0

如果您正在考虑由于多个用户而出现的多个实例,您可能希望实例化一个视图模型实例并掌握如何使用您的 ORM 和数据库来执行此操作,这涉及到理解乐观与悲观锁定。这是一个链接,其中包含有关 EF 如何支持这一点的信息,尽管我个人使用 NHibernate。我还建议您也更喜欢乐观锁定。

如果您在用一个用例谈论同一域对象(即人)的多个视图,您可能需要不同的视图模型,尽管可以使用同一视图模型的多个实例。无论哪种方式,这里的同步都不是数据库的责任。这是一个很好的链接,它探索了偏向事件聚合器的各种可能性

HTH,
绿柱石

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

于 2011-02-11T20:32:12.013 回答