分层企业应用程序中的WPF MVVM体系结构

时间:2014-02-05 05:11:25

标签: .net wpf design-patterns mvvm architecture

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

数据层

我通常使用ORM工具将数据持久保存到数据库中。

业务层

这包括我的所有业务模型和业务逻辑。

服务层

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

演示文稿图层

此图层用于演示逻辑。


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

这个问题的推荐方法是什么?我错过了什么吗?是否应该有另一层抽象,以便表示层(WPF)包含“View”,“ViewModel”和“Model”???

2 个答案:

答案 0 :(得分:5)

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

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

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

通过对命令和PropertyChanged事件做出反应,您的ViewModel可以充当模型的控制器。如何访问模型取决于您的设计,您可以使用不需要了解ViewModel,命令,属性或其他内容的服务层。您的ViewModel只是在响应用户操作时与其交互,并更新其自己的属性以通知View的结果。

请注意,服务层公开的模型不需要与业务层内部使用的模型相同。例如,您的服务层可能使用DTO与ViewModel进行通信,并且DTO可能与您的业务模型对象明显不同。

这只是WPF可能的分层架构的快速总体情况,您可以使用更多选项,模式和工具。 (通过搜索MVVM,你可能会找到比这更好的解释。)

编辑回答评论问题

  

所以你基本上说“View”和“ViewModel”应该在WPF项目中,而“Model”本质上是从服务层传递的内容?

是的,View和ViewModel通常驻留在同一个项目中。典型的设置是创建View和ViewModel文件夹,并为每个视图提供ViewModel - 甚至在同一个文件夹中。

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

答案 1 :(得分:0)

在Web应用程序的情况下,MVVM在客户端上扮演角色。模型是普通格式(可能是JSON)结构的数据,因为它们来自服务器,视图模型是您实际绑定到演示文稿的数据,以及您收集用户修改的位置。视图当然是网页本身。您可能希望将一些库作为Backbone进行研究,以更好地阐明概念。