在WPF应用程序中始终使用MVVM,还是其他模式仍然实用/有用?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (64)

Microsoft .NET架构企业应用程序一书的第374页中,有一个关于表示层模式演变及其对平台影响的图表(图7-14)。

除了展示从原始MVC模式演变到更现代的变体外,该图表还显示了以下现代模式可应用于以下技术:

  1. Model2(MVC)
    • 仅限Web

  2. 被动视图(MVP)
    • 卷筒纸
    • 的WinForms
    • WPF

  3. 监督控制器(MVP)
    • 卷筒纸
    • 的WinForms
    • WPF

  4. MVVM(演示模型)
    • 仅限WPF

根据我的理解,如果用WPF开发,那么MVVM模式是事实上的选择(有点像Model2是用于Web开发的)。也就是说,在WPF应用程序中,似乎没有任何东西阻止使用被动视图监督控制器Presenter First。如果前端是WPF,WinForms或Web,那么这种方法会导致应用程序无法真正关心。看起来这些MVP变体允许更多的灵活性。

但是,针对UI平台无关的灵活性(可能不需要)的目标是以WPF开发更加困难和损失WPF提供的部分功能为代价?成本如此之高以致于成本大于收益?

换句话说,MVVM如此之大,以至于WPF应用程序中不应该考虑其他选择?

提问于
用户回答回答于

MVVM是WPF中95%应用程序的体系结构。

选择任何其他体系结构意味着安置一些不如你能得到的最好的东西。在RS Conley的情况下,Passive View可能是最好的选择,但这不是正常情况。

作为理解MVVM如何更好的一种方式,让我们看看他在采用PassiveView方法时会失去什么。

可维护性

在被动视图中,ViewModel知道IView,这意味着SRP(单一责任原则)不被保留。PassiveView中的控制器直接与Model和View进行交互,因此可以做两件完全不同的事情!

在MVVM下,作为应用程序核心的ViewModel只有一个问题,那就是包含应用程序的状态和逻辑。这种代码的可维护性实际上超越了PassiveView,MVP或MVC。

确实,PassiveView在自动测试Coverege方面更好,但恕我直言,代码的良好可维护性更重要。可测试性有助于确保您不会破坏您的代码,而可维护性可帮助您避免构建有问题的代码。

当涉及到可维护性时,MVVM和PresentationModel是以前UI架构的演化,这是因为SRP原理非常严格。在MVVM中编写足够的代码,你会明白我的意思。

可混合性

MVVM真正强大的另一个特点是可混合性。由于所有的应用程序状态都保存在ViewModel中,所以很容易在设计时伪造数据,从而提高生产力。这是无法在PassiveView,MVP或MVC中创建的,因为在所有这些体系结构中,控制器必须主动将数据放入视图中。在MVVM中,数据只是“跳转”到视图,因此可以被模拟。

可测性

这确实是PassiveView优于MVVM的地方。如果100%的单元测试覆盖率对你至关重要,那么这是一件大事。然而,在大多数情况下,MVVM允许您的覆盖范围已经足够了,您通常会使用常规UI测试(您最终还会在PassiveView中以btw方式进行的操作)添加另一层测试。

MVVM不是正确的选择?

去年我参与了约15个WPF和Silverlight项目,所有这些都与MVVM完美契合。我认为,在演示逻辑非常大的地方,比如在游戏中,MVVM可能不是正确的选择。除了游戏之外,我不能真正想到应用程序类别不适合MVVM,除了RS Conley提到的特殊情况之外。

用户回答回答于

根据MVVM for WPF中包含的文档(总介绍的第2页)

这种模式的起源是模糊的,但它可能来自Smalltalk ApplicationModel模式,Martin Fowler描述的PresentationModel模式也是如此。当Expression团队开发Blend的第1版时,它已经适应WPF的使用。没有WPF特定的方面,Model-View-ViewModel模式与PresentationModel相同。

与被动视图和监督控制器相比,演示模型允许您编写完全独立于用于显示的视图的逻辑。您也不需要依赖视图来存储状态。缺点是您需要演示模型和视图之间的同步机制。这种同步可能非常简单,但它是必需的。分离演示需要少得多的同步,而被动视图根本不需要任何。

  1. 通过模拟对象实现视图使测试更容易,从而使我的软件的绝大多数功能都能够自动测试
  2. 不仅要重用核心模型,还要针对相关类型的金属切削软件使用不同的视图。
  3. 清楚地记录视图和模型之间的交互。
  4. 为了销毁对GUI工具箱的依赖,因为这个软件自1985年以来一直在不断发展,并且在底层工具,API甚至语言本身上发生了一些重大变化。

MVVM,演示模型,监督控制器模式可以处理前三个问题。但只有被动观点处理#4。

被动视图不需要任何同步方法。MVVM是WPF演示模型的一个实现。您依赖于XAML接口将视图模型中的视图状态与视图本身绑定。因此,如果稍后您更改UI或其API,那么您的View Model也将被更改。

相比之下,被动视图只需要新UI元素实现视图界面。无论它们实际连接的是什么,也不管实现的形式或控件是否正确响应。

对于你关于MVVM成为WPF的问题的简短回答,答案是否定的。鉴于围绕您的应用程序开发的其他问题,这是一个需要考虑的工具。

扫码关注云+社区