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

Coo*_*eze 2 .net architecture wpf design-patterns mvvm

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

数据层

我通常使用ORM工具将数据持久化到数据库.

业务层

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

服务层

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

表达层

该层用于表示逻辑.


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

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

jno*_*ovo 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 - 甚至在同一个文件夹中.

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