首页 文章

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

提问于
浏览
2

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

Data Layer

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

Business Layer

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

Service Layer

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

Presentation Layer

该层用于表示逻辑 .


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

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

2 回答

  • 5

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

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

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

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

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

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

    Edit answering comment question

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

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

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

  • 0

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

相关问题