MVVM是否违反DRY?

Edw*_*uay 39 wpf design-patterns mvvm

似乎我制作的ViewModels看起来像其他类一样可疑,它们似乎需要大量的代码重复,例如在我当前的项目中:

  • SmartForm:表示要填充的数据表单的模型,具有以下属性:
    • IDCODE
    • 标题
    • 描述
    • SmartFormFields的集合
    • 等等
  • SmartFormControlView 视图
  • SmartFormControlViewModel ViewModel
    • IDCODE
    • 标题
    • 描述
    • SmartFormFields的集合
    • 等等

因此,我的ViewModel与我的模型基本相同,只是具有与View绑定的所有OnPropertyChanged功能.

似乎我重构并扩展了我对模型所做的每一点改变,我必须对 ViewModel 进行镜像更改.

这似乎违反了模式的基本规则不要重复自己.

我是否错误地实现了MVVM模式,或者它只是MVVM的固有特性,模型和ViewModel之间始终存在一对一的重复?

mic*_*tan 23

我个人不认为它违反DRY,因为模型和视图模型(我更喜欢术语演示者)不指向相同的信息.例如,您的VM和M都具有Title属性,但您的VM的Title属性也可以包含验证,而您的模型的Title属性可以假定有效性.

虽然虚拟机可能包含模型的所有属性,但也有可能进行验证(例如,标题必须是非空白的),数据依赖性,可绑定的UI特定属性(图标,颜色,画笔,等)不属于视图的一部分.

基本上所有UI模式在您声明它的方式上都有类似的"重复":即级联修改.尝试在不更改控制器的情况下更改MVC中的模型.

话虽这么说,MVVM(或任何用于分离UI,逻辑和状态的UI模式)对于简单的情况(例如您的示例)来说可能过于繁琐.当逻辑变得只是状态传递时,分隔控制器/演示者/视图模型的值减小.

在您的特定情况下,如果您的VM没有任何逻辑,验证或UI特定属性,并且您的模型不必持久化,序列化或向后兼容现有结构(或者在VM中添加逻辑这样做很简单),我强烈考虑将M和VM结合起来以避免创建其唯一目的是获取/设置基础模型属性的属性.

  • 我永远不会在模型层面上承担有效性.抽象模型的一个主要好处是,您可以用其他东西(不同的UI,Web服务)替换UI层并获得代码重用.如果将模型验证委派给原始UI,则无法正确重用模型. (2认同)