在MVVM LOB应用程序中,假设我有一个允许用户启动长期运行的业务流程的ViewModel,让我们假装它是创建订单的工作流程。
在ViewModel上执行CreateOrder
命令时,如何在其生命周期内创建和管理UnitOfWork
对象(EF中的DbContext
)? ViewModel是否负责管理其生命周期,将其传递给某个向导对话框服务,并最终将其提交到数据库?似乎违反了SRP。但是如果ViewModel不管理这个过程,那么/什么呢?某种OrderManagerService
?
此外,IoC /依赖注入在哪里适合这张图片?对于单元测试显然我不希望ViewModel实例化一个耦合到数据库的新UnitOfWork
。但是,如果此业务流程仅在用户请求时启动,则显然在应用启动时无法将UnitOfWork
注入ViewModel。
由于
答案 0 :(得分:1)
我认为您使用OrderManager服务将其钉住了。您真的不希望在视图层中发生此更改的累积。创建一个PendingOrder对象以累积UnitOfWork模式。放入内存存储器或外部数据存储(可能是内存)。
这样可以保持视图层清洁,并使测试更容易。
它可以解决您的IOC /测试问题。单独测试您的PendingOrder代码,与您的UI无关。然后你可以模拟/存根它进行UI测试。