新手在这里,对不起,如果这是一个明显的问题,对不起我的英语。我试过谷歌,但没有找到我的问题的答案。
我只使用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
答案 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的默认行为将在典型情况下智能且适当地缓存。