wpf - 适合熟悉 MVVM 的人的 MVC 教程/演练?

标签 wpf asp.net-mvc design-patterns mvvm

我习惯于使用 MVVM 设计模式在 WPF 中工作,但最近有人要求我在 ASP.Net 中做一些事情。我想尝试使用 MVC,因为我在学习 MVVM 时看到它被引用了很多,但是我对此一无所知。

我可以找到很多旨在向熟悉 MVC 的人解释 MVVM 的网站,但是我找不到一个向习惯 MVVM 的人解释 MVC 的好网站。有些网站会单独解释 MVC,但我很难理解它们,因为我的头脑一直在尝试应用 MVVM 逻辑。

那么,有没有什么好的网站可以用习惯了 MVVM 的人可以理解的术语来解释 MVC?或者有人可以在这里向我解释一下吗?

最佳答案

当您来自 MVVM 模式并开始使用 MVC 模式(尤其是 ASP.NET MVC)时,我建议将“MVC”模式更好地视为“VMVC”,因为 MVC 中的“M”不是 Model 在 MVVM 中用“M”表示。它实际上对应于 ViewModel。我不知道这是否代表了 MVC 的一般定义,但它是真实的,并且是您使用 ASP.NET MVC 时最常用的最佳实践(尽管您时不时地在 SO 上看到域实体所在的示例或问题)在 View 中使用(有时正是问题中描述的问题的原因))。

当我从一个 Visual Studio 模板创建 ASP.NET MVC 项目时,我通常做的第一件事是将创建的文件夹“Model”重命名为“ViewModel”。如果您看一下模板代码对这些“模型”做了什么,您会发现它们直接用于 View ,它们具有用于输入验证、显示格式以及 View 上的字段命名的数据注释。这些注释部分由 HTML 帮助器直接使用以生成 HTML,并不表示域或业务逻辑。换句话说:它们是用于 Razor/HTML View 的 ViewModels,就像您在 MVVM 中将 ViewModels 用于 WPF/Silverlight/Phone7 中的 XAML View 一样。

域“模型”实际上不是 MVC 模式的一部分,因为它是 MVVM 模式的一部分。因此,当您将 MVVM 与 MVC 进行比较时,这些缩写有些误导。作为一个非常简化的“翻译表”,可以说:

MVVM                         MVC
----                         ---
M  -> Domain Model           not part of the pattern
V  -> View (XAML)            V -> View (HTML, Razor)
VM -> ViewModel              M -> ViewModel
not part of the pattern      C -> Controller

我不确定 Controller 在 MVVM 中对应的东西。在 MVC 中, Controller 通常是将域对象转换为 ViewModel,然后转换为 View (反之亦然)的模块 - 示意图:

ControllerActionForGetRequest ( params )
{
     objects = GetDomainObject(params)    - entities, queryables or DTOs
     viewModel = CreateViewModelFromDomainObjects(objects)
     view = CreateViewFromViewModel(viewModel)
}

ControllerActionForPostRequest ( viewModel )
    // ModelBinder makes "viewModel" from HTML input fields, etc
{
     if (IsValid(viewModel))
     {
         data = CreateDomainObjectsOrDtosFromViewModel(viewModel)
         WriteData(data)  - back to data store
         RedirectToActionForGetRequest
     }
     else
         GoBackToView
}

MVVM 中的哪个部分有这个职责?我不知道。我见过这样的设计,其中 ViewModel 持有对存储库的一些引用,提取模型(域模型)以填充其自己的属性并通过 ICommand 处理程序写回存储库。这意味着 MVVM 中的 ViewModel 也有责任成为“ Controller ”,而 MVC 中的 ViewModel 则简单得多:它们或多或少只是带有元数据的属性包,用于为 View 提供和格式化数据。

最后一点:我个人发现 WPF 的 MVVM 模式比 MVC 模式更难掌握。 ASP.NET MVC 是从头开始设计的,以支持 MVC 模式友好的开发,并且没有必要(甚至不可能)离开这种方式。 WPF 不是这种情况。最初的设计是在考虑 View 和代码隐藏文件的情况下构建的,而不是 MVVM 模式。我经常发现很难将 View 元素或属性绑定(bind)到 ViewModel 而在代码隐藏文件中处理它要容易得多的情况,因此有点违反 MVVM 原则。

我认为当你有 MVVM 模式的经验时,你进入 MVC 不会有任何问题。

关于wpf - 适合熟悉 MVVM 的人的 MVC 教程/演练?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7931824/

相关文章:

c# - WPF ListBox WPF XAML 内的顶部对齐

c# - 什么会导致编码 UI 测试中错误的 UI 控件层次结构?

wpf - 获取 ComboBoxItem 的宽度

wpf - 默认输入和空格键行为 wpf 应用程序

asp.net-mvc - 将字符串编码为 Html Asp.Net MVC

asp.net-mvc - 如何为 mvc 应用程序中的所有 Controller 启用 ssl

c# - 画笔算法/颜色褪色模式 - 需要建议

asp.net-mvc - ActionLink 扩展方法 MVC5 中的 htmlAttributes

design-patterns - 设计模式与框架

c# - 如何使用 XML 序列化抽象创建单例