我最近在一次采访中被问到这个问题。他想知道 Model View 和 ViewModel 的实例化顺序,具体的实例化顺序是什么?
我认为视图总是先实例化,然后是视图模型,然后是模型。我错了吗?
我认为视图总是先实例化,然后是视图模型,然后是模型。我错了吗?
没有单一的标准。一般来说,有两种方法:
View-First - View 将首先实例化,然后实例化 ViewModel,这可能会创建底层模型。这通常意味着实例化的顺序是 View->ViewModel->Model。
ViewModel-First - 创建 ViewModel,然后实例化模型。View是系统在ViewModel之后基于DataTemplates生成的。这意味着实例化的顺序是 ViewModel->Model,然后是 View(间接来自 XAML)。
大多数主要面向设计者优先方法的框架倾向于进行视图优先构造。这使得与设计师合作更容易(通常)。
许多主要面向以开发人员为中心的场景的框架通常会首先使用 ViewModel。这种方法实际上可以导致更少的耦合,以及更简单的“仅代码”构造 ViewModel 级别的所有内容。
这是一个开放式问题,因为您可以从概念上看它,在这种情况下,它遵循首字母缩略词。如果您在实践中查看它(特别是指 WPF 或 WinStore 应用程序),它会有点不同。
概念上
应该首先实例化模型,因为应用程序的所有后续决策都将基于应用程序设计运行的模型。然后是视图模型,因为视图依赖于视图模型,而不是相反。一个 VM 可以有多个视图,但一个视图通常没有多个视图模型(通常!)。然后是呈现数据的视图。
练习(在 WPF 和 WinStore 应用程序中)
App 类首先被实例化,它适合 VM-M 区域的一些奇怪部分。但这并不完全相关,因为它超出了模式的范围。通常首先创建视图并将其附加到可视化树。然后 ViewModel 在代码隐藏中实例化,此时模型被加载。然后会发生大规模的 UI 刷新,显示最初加载的所有内容。从那时起,“概念上”部分的一切都成立。
这个问题可能会因意见而关闭,因为没有明确的答案。但这是我所见、所读和所经历的。
嗯,这是一个奇怪的面试问题。在我看来,总的来说,我会同意你的看法。视图模型将实例化模型,视图将首先出现,实例化视图模型。但当然,这在很大程度上取决于应用程序的架构。WPF 的美妙之处使这些事情能够以不同的方式完成。然后你也有依赖注入,所以我想说答案应该是“它取决于”。
恕我直言,这是一个特洛伊木马问题,看看人们如何思考而不是实际答案,看看是否可以量化他们在实际 MVVM 项目中的经验。
这个问题有点傻,因为它仅限于每个层都是一个类的简单场景。假设一个视图模型提供另一个视图模型。如果我们决定“视图优先”,我们是否需要在允许在原始视图模型上调用该函数之前创建另一个视图?如果必须根据返回的视图模型选择视图怎么办?另一方面,如果我们决定“viewmodel 优先”,如果必须根据视图输入的参数选择新的 viewmodel 怎么办?
分层架构是关于依赖关系的。MVVM 说 V 取决于 VM,VM 取决于 M。它没有说明实例化顺序。您可能决定将依赖项传递给构造函数,这意味着实例化顺序需要是 M-VM-V,但我认为没有任何实际理由尝试在整个应用程序中强制执行这样一个小细节