gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 10:50:28 24 4
gpt4 key购买 nike

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

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

最佳答案

如果您正在考虑由于多个用户而产生的多个实例,您可能希望实例化一个 View 模型实例并掌握如何使用您的 ORM 和数据库来执行此操作,这涉及到理解 optimistic v pessimistic locking .这是一个具有 information on how EF supports this 的链接,虽然我个人使用NHibernate。我还建议您也更喜欢乐观锁定。

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

高温下,
绿柱石

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

关于mvvm - 多个 ViewModel 请求相同的域对象,我应该给它们相同/不同的实例吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4963267/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com