MVVM + Entity Framework 架构混淆

5
我在WPF应用程序中使用Prism框架和EF。
视图模型:
- 保留由Unity容器传递的服务引用。
服务:
- 提供与数据相关的“高级”操作 - 保留仓储的引用,仓储提供数据库的基本CRUD操作(每个仓储一个单独表)。
仓储:
- 仓储中的每个方法都使用“using”模式,在其中使用短暂的对象上下文。 - 当对象上下文被处理后,无法再使用映射的属性。我的数据库模型很复杂(许多相关表格),检索数据时需要很多.Include()调用,导致代码难以维护。
经过阅读多个线程,我发现“工作单元”模式可能是我需要的。
我的问题是:
- 谁保留工作单元的引用(因此也包含上下文)? - 如果我选择每个视图的上下文方法,那么ViewModel应该具有上下文引用。然后,我如何将工作单元注入到服务中呢?或者应该在ViewModel中创建新的Service实例,并通过构造函数参数传递上下文?
1个回答

3
我们在一个项目中使用了类似的架构:
  • 每个ViewModel都有自己的Service对象,该对象在构造函数中被注入(至少是直接对应于View的顶级对象。一些层次结构的ViewModel可能会重用其父级的Service,但在这里我们保持简单)。

  • 默认情况下,每个Service操作都会创建一个新的上下文,但是...

  • Service具有BeginContext和EndContext方法,可以由ViewModel调用以在多个操作中保持上下文的开放状态。

这对我们效果很好。大多数情况下,我们在打开View时调用BeginContext,在关闭View时调用EndContext。


1
最终,我使用以下方法解决了这个问题:当View被打开时,ViewModel创建了UnitOfWork对象,它由上下文和多个服务组成。同一工作单元中的服务注入相同的上下文。当View关闭时,UnitOfWork被处理。此线程中的项目[链接](http://teusje.wordpress.com/2011/10/16/unicornmanager-prism-4-mef-wpf-ef-4-1-code-first-nuget-datavalidation/)也很有启发性。谢谢,Daniel。 - yurislav

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接