ViewModel类应该如何重用?

时间:2010-03-15 12:30:36

标签: .net wpf mvvm viewmodel reusability

我正在研究WPF应用程序,我正在使用MVVM模式构建它。最初我有一个想法,ViewModels应该是可重用的,但现在我不再太确定了。

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

因此;是否应该考虑具有一个特定View的ViewModel类,或者考虑可重用性?

4 个答案:

答案 0 :(得分:12)

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

  

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

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

MVVM与WPF一起考虑的另一件事是数据模板。如果每个ViewModel迎合一个且只有一个视图,则更容易实现。

答案 1 :(得分:3)

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

答案 2 :(得分:2)

在我看来, MVVM的主要目标是消除单元测试无法轻易测试的代码。由于视图模型可以进行单元测试,但视图不能,因此可以通过尽可能使视图变得愚蠢来实现。理想情况下,就像使用XAML一样,视图完全是声明性的,并且只对视图模型进行数据绑定。因此,“没有代码背后”的口头禅。

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

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

答案 3 :(得分:0)

这是一个老问题,所以我不愿添加另一个答案。但到目前为止发布的所有答案都忽略了这一点。 The answer from MSDN非常清楚:ViewModel非常专门用于各种操作系统的许多视图共享,如下图所示:

enter image description here

否则将导致冗余代码。