在MVVM模式中,建议的实例化顺序是什么?

时间:2013-10-04 18:03:29

标签: c# wpf mvvm

我最近在接受采访时得到了这个问题。他想知道Model View和ViewModel的实例化顺序,实例化的确切顺序是什么?

我认为视图总是先实例化,然后是视图模型,然后是模型。我错了吗?

5 个答案:

答案 0 :(得分:9)

  

我认为视图总是先实例化,然后是视图模型,然后是模型。我错了吗?

没有单一的标准。一般来说,有两种方法:

  1. View-First - View将首先被实例化,然后实例化ViewModel,这可能会创建底层模型。这通常意味着实例化的顺序是View-> ViewModel-> Model。

  2. ViewModel-First - 创建ViewModel,然后实例化Model。视图由ViewModel之后基于DataTemplates的系统生成。这意味着实例化的顺序是ViewModel-> Model,然后是View(间接来自XAML)。

  3. 大多数面向设计师优先方法的框架倾向于进行View-First构造。这使得设计师(通常)更容易使用。

    许多面向以开发人员为中心的场景的框架通常会首先使用ViewModel。这种方法实际上可以导致更少的耦合,以及从ViewModel级别更简单的“仅代码”构造。

答案 1 :(得分:6)

这是一个开放式的问题,因为你可以从概念上看它,在这种情况下,它遵循首字母缩略词。如果你在实践中看它(特别是指WPF或WinStore应用程序),它有点不同。

<强>概念

应首先实例化模型,因为应用程序的所有后续决策都将基于应用程序设计用于操作的模型。然后是视图模型,因为视图依赖于视图模型,而不是相反。一个VM可以有多个视图,但一个视图通常没有多个视图模型(通常!)。然后是显示数据的视图。

练习(在WPF和WinStore应用中)

首先实例化App类,它适合VM-M区域的某些奇数部分。但这并不完全相关,因为它超出了模式的范围。通常会创建视图并将其附加到可视树中。然后在代码隐藏中实例化ViewModel,此时加载模型。然后发生大量UI刷新,显示最初加载的所有内容。从那时起,“概念”部分中的所有内容都成立。

这个问题可能因意见而被关闭,因为没有明确的答案。但这就是我所看到,阅读和体验过的。

答案 2 :(得分:0)

那是一个奇怪的面试问题。在我看来,总的来说,我同意你的观点。视图模型将实例化模型,视图将首先出现,实例化视图模型。但当然,它在很大程度上取决于应用程序的体系结构。 WPF的美妙之处在于能够以不同的方式完成这些事情。那么你也有依赖注入,所以我会说答案应该是'它取决于'。

答案 3 :(得分:0)

问题有点愚蠢,因为它仅限于一个简单的场景,每个层都是一个单独的类。假设一个视图模型提供另一个视图模型。如果我们决定“视图首先出现”,我们是否需要在允许在原始视图模型上调用该函数之前创建另一个视图?如果必须根据返回的视图模型选择视图,该怎么办?另一方面,如果我们决定“viewmodel是第一个”,那么如果必须根据从视图输入的参数选择新的viewmodel呢?

分层架构是关于依赖关系的。 MVVM说V依赖于VM而VM依赖于M.它没有说明实例化顺序。您可能决定将依赖项传递给构造函数,这意味着实例化顺序需要是M-VM-V,但我没有看到任何实际的理由试图在整个应用程序中强制执行这么小的细节

答案 4 :(得分:0)

恕我直言这是一个特洛伊木马问题,看看人们如何看待实际答案,看看是否可以量化他们对实际MVVM项目的体验。