分层企业应用程序中的 WPF MVVM 架构

Posted

技术标签:

【中文标题】分层企业应用程序中的 WPF MVVM 架构【英文标题】:WPF MVVM Architecture in Layered Enterprise Application 【发布时间】:2014-03-01 09:41:55 【问题描述】:

我是 WPF 和 MVVM 的新手。这就是我通常为 ASP.net 应用程序设置架构的方式:

数据层

我一般使用 ORM 工具将数据持久化到数据库中。

业务层

这包括我所有的商业模式和商业逻辑。

服务层

该层用作后端系统的入口点。 (有时通过 WCF)。该层负责将业务模型转换为视图模型。

表示层

该层用于表示逻辑。


我知道 MVVM 的视图是 .XAML 文件并驻留在 WPF 应用程序中。但是我对“模型”和“视图模型”有点困惑,因为我的业务层中已经有一个“模型”,而我的服务层中有一个“视图模型”。我可以只使用这些,但这意味着我的服务层将绑定到特定的实现,因为它需要包括:RelayCommand、Oberservable Objects 等。

解决此问题的推荐方法是什么?我错过了什么吗?是否应该有另一个抽象层,以便表示层(WPF)包括“视图”、“视图模型”和“模型”???

【问题讨论】:

Web 应用程序中的 MVVM (kindof) 仅在客户端上玩游戏。 我认为更适合 Web 的模式是 MVP 或 MVC。我的问题是关于 WPF 应用程序的? 【参考方案1】:

MVVM 更恰当的名称应该是 View - ViewModel - Model,因为这将表达它们实际上是如何分层的。 ViewModel 用于使您的模型适应视图。这是通过绑定属性来实现的。

View 需要了解的关于 ViewModel 的唯一信息是它公开了哪些属性。 ViewModel 不需要知道关于 View 的任何信息。它们通过 INotifyPropertyChanged 通过这些 ViewModel 属性进行通信,具体取决于您配置绑定的方式(因此属性值从 ViewModel 流向 View,反之亦然,或两者兼而有之)。

它们之间的另一种常用通信方式是由界面调用以响应某些用户操作(典型示例,按钮按下)的命令。 View 还可以通过绑定调用 Commands,ViewModel 可以注册处理程序以响应 Command 调用。

通过对命令和PropertyChanged 事件做出反应,您的 ViewModel 可以充当模型的控制器。你如何访问你的模型取决于你的设计,你可以使用一个不需要知道任何关于你的视图模型、命令、属性或什么的服务层。您的 ViewModel 只是在响应用户操作时与其交互并更新其自己的属性以将结果通知给 View。

请注意,服务层公开的模型不必与业务层内部使用的模型相同。例如,您的服务层可能使用 DTO 与 ViewModel 进行通信,而 DTO 可能与您的业务模型对象有很大不同。

这只是 WPF 可能的分层体系结构的快速总体图,还有更多选项、模式和工具可供您使用。 (通过搜索 MVVM 可能会找到比这更好的解释。)

编辑回答评论问题

所以你基本上是说“视图”和“视图模型”应该在 WPF 项目中,而“模型”本质上是从服务层传递的?

是的,View 和 ViewModel 通常位于同一个项目中。一个典型的设置是创建 View 和 ViewModel 文件夹,并为每个 View 拥有一个 ViewModel - 甚至在同一个文件夹中。

在大型项目中,视图和视图模型可能位于不同的程序集中。如前所述,ViewModel 独立于绑定到它们的 View:它们不需要知道有关 View 的详细信息,这就是它们对测试如此友好的原因。但是,由于它们非常紧密地一起工作,因此设计 ViewModel 和 View(及其要求)是很常见的,因此具有高度的耦合性,这使得它们极不可能重用(因此,它们最终在同一个程序集中)。

【讨论】:

感谢您的回复。我已经阅读了相当多的内容,并对 MVVM 模式有了基本的了解。我想我想弄清楚它是如何在分层应用程序中实现的。所以你基本上是说“视图”和“视图模型”应该在 WPF 项目中,而“模型”本质上是从服务层传递的? 干杯...这就是我最初计划这样做的方式,但它看起来像是重复的 ViewModel,即服务层返回的 ViewModel,然后是包含所有绑定的表示层中的 ViewModel和命令行为? 在一个简单的场景中,您可能会将 ViewModel 视为模型属性到 View 的适配器以及用于交互逻辑的控制器。 (把这句话看作是对事情的过度简化。)【参考方案2】:

MVVM 在 Web 应用程序中仅在客户端上扮演角色。模型是来自服务器的纯格式(可能是 JSON)结构的数据,视图模型是您实际绑定到演示文稿的数据,也是您收集用户修改的地方。视图当然是网页本身。您可能想研究一些作为 Backbone 的库,以更好地阐明这个概念。

【讨论】:

以上是关于分层企业应用程序中的 WPF MVVM 架构的主要内容,如果未能解决你的问题,请参考以下文章

测试驱动设计和分层架构

系统架构师-基础到企业应用架构-企业应用架构

WPF - 将 DAL 放在 MVVM 的 3 层架构设计中的啥位置?

网络分层架构灵活应对企业上云挑战

网络分层架构灵活应对企业上云挑战

网络分层架构灵活应对企业上云挑战