7

我正在开发一个 WPF 应用程序,并且正在使用 MVVM 模式来构建它。最初我认为 ViewModel 应该是可重用的,但现在我不太确定了。

  • 如果我需要 WinForms 应用程序的类似功能,我是否应该能够重用我的 ViewModel?
  • Silverlight 不支持 WPF 所做的所有事情 - 我应该能够重用 Silverlight 应用程序吗?
  • 如果我想为我的应用程序制作一个 Linux GUI 怎么办。然后我需要在 Mono 中构建 ViewModel - 这是我应该争取的吗?
  • 等等..

所以; 应该考虑一个特定的视图来编写 ViewModel 类,还是考虑可重用性?

4

4 回答 4

14

要回答您的问题,请考虑单一责任原则:

“一个班级应该有一个,而且只有一个改变的理由。”

我想说,在合理的范围内,您通常不想为多个视图重用 ViewModel。我争论的主要原因是,这会给你的 ViewModel 带来不止一个改变的理由。换句话说,如果一种或另一种观点发生变化,它就需要改变,在我看来,这是改变的两个原因。它停在哪里?在这种情况下,我会保持简单,并将一个 ViewModel 绑定到 View。

使用带有 WPF 的 MVVM 需要考虑的另一件事是数据模板。如果每个 ViewModel 只满足一个视图,那么实现起来会容易得多。

于 2010-03-15T12:34:45.487 回答
3

总的来说,应用 YAGNI 原则——你可能不需要它。除非您认为这些事情可能会发生,否则我会采用最简单的方法来让您的软件满足您当前的需求。

于 2010-03-15T12:36:18.590 回答
3

在我看来,MVVM 的主要目标是消除无法通过单元测试轻松测试的代码。由于视图模型可以进行单元测试而视图不能进行单元测试,因此可以通过使视图尽可能地哑来实现这一点。理想情况下,与 XAML 一样,视图是完全声明性的,并且仅在视图模型上进行数据绑定。因此,“没有代码背后”的口头禅。

跨不同 UI 技术的视图模型的可重用性并不是 MVVM 的真正目标。如果您尝试一下,您可能会想再次将特定于 UI 技术的代码移动到视图中,以保持视图模型的可重用性。这将违背可测试性的主要目标。

如果您真的发现自己需要支持不同的 UI 技术,那么您仍然可以将视图模型的通用逻辑分解到共享的“表示”层中。在确定有必要之前,我不会这样做。

于 2010-03-15T12:54:25.627 回答
2

这是一个老问题,所以我犹豫要添加另一个答案。但是到目前为止发布的所有答案都没有抓住重点。 MSDN 的答案非常明确:ViewModel 非常特别地旨在由跨各种操作系统的许多视图共享,如下图所示:

在此处输入图像描述

否则将不可避免地导致冗余代码。

于 2016-12-24T20:14:30.553 回答