使用MVVM处理WPF应用程序并由Entity Framework提供支持。出于可用性目的,我们非常希望允许用户多窗口此应用程序。但是,这可能会导致EF出现问题。如果我们坚持通常建议每个ViewModel创建一个Repository副本,并且有人打开同一个ViewModel的多个窗口,那么它可能导致" IEntityChangeTracker的多个实例"错误。
我们通过在获取新数据上下文的存储库上放置Refresh方法来解决这个问题,而不是单独使用具有自身问题的Singleton。然后我们在整个商店做这样的事情:
using (IRepository r = Rep.Refresh())
{
r.Update(CurrentCampaign);
r.SaveChanges();
}
哪个很好。但是,它会导致维持状态的问题。如果在用户使用对象时刷新上下文,则其更改将丢失。
我可以看到两种方法,这两种方式都有其自身的缺点。
还有其他办法吗?
答案 0 :(得分:1)
我认为将实体框架作为单例访问的存储库可能并不总是错误的。
如果你有一个场景,你有一个客户端存储库,即一个存储库,它是客户端应用程序的可执行文件的一部分,即由一个客户端使用,那么单例可能没问题。当然我会不在服务器端使用单例。
我向Brian Noyes(微软MVP)询问了关于复数网站上“MVVM”课程的类似问题。
我问:“处理视图模型中使用的客户端服务的正确方法是什么?”
在他的回答中,他写道:“...我的大多数客户服务都是单身人士,并且在应用程序的生命周期中生活。”
此外,只要你有一个单身人士的界面,拥有单身人士并不会阻止你编写单元测试。
如果您使用依赖注入框架(请参阅标记注释),这对自己来说是一个好主意,更改为单例实例化只需对相应类的注入容器的设置执行小的更改。