使用具有Wpf MVVM的非贫困域模型

Ria*_*ana 6 dns wpf domain-driven-design model mvvm

我正在使用MVVM为UI实现基于WPF的应用程序.

我有一个ViewModel,它包装了每个可编辑的可编辑模型.VM包含处理错误通知的所有逻辑,"脏"管理等等.

这种设计支持用于简单域模型对象的CRUD schenarios,这些对象是贫血的,即不包含任何逻辑.

现在,我面临一个更棘手的问题,因为我有一个包含逻辑的域模型,逻辑可以改变域模型的内部状态.

有人已经面对这种情况吗?如果是这样,你有什么建议来正确处理这个问题吗?

Riana

Dan*_*ger 9

以下是我通常如何处理它:

  1. ViewModel层由属于该层的类型组成,这意味着我不会直接在ViewModel中使用我的业务对象.我将业务对象映射到ViewModel对象,这些对象可能是也可能不是完全相同的形状减去行为.可以认为这违反了"不要重复自己",但这样做可以让您遵守单一责任原则.在我看来,SRP通常应该胜过DRY.ViewModel用于为视图提供服务,并且该模型用于提供业务规则/行为.

  2. 我创建了一个Facade/service层,它接受并返回ViewModels作为参数,但是将ViewModels映射到相应的业务对象版本.这样,非贫血对象不会在ViewModel上施加非视图逻辑

依赖关系如下所示:
ViewModel < - > Facade/ServiceLayer - > Business Objects

我想如果你想释放MVVM的全部潜力,请记住这一点很重要:ViewModel是视图的模型/抽象,而不是呈现给视图的模型.

  • 假设我们有一个"计算总计"按钮和一个OrderViewModel.单击按钮将触发一个CalculateOrder命令,该命令将调用ViewModel上的CalculateOrder方法,而ViewModel又调用_facade.CalculateTotal(orderViewModel); Facade会将所有内容映射到业务对象,计算总数,然后返回更新的ViewModel. (3认同)