当前位置: 首页 > 知识库问答 >
问题:

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

翁凯定
2023-03-14

我是WPF和MVVM的新手。这是我通常为ASP.NET应用程序设置体系结构的方式:

数据层

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

业务层

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

服务层

这一层用作进入后端系统的入口点。(有时通过周转基金)。这一层负责将业务模型转换为视图模型。

表示层

这一层用于表示逻辑。

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

对于这个问题,推荐的方法是什么?我是不是漏掉了什么?是否应该有另一个抽象层,以便表示层(WPF)包括“视图”、“ViewModel”和“Model”?

共有1个答案

逑兴安
2023-03-14

MVVM更恰当的名称是view-viewmodel-model,因为这将表示它们实际上是如何分层的。ViewModel的目的是使模型适应视图。这是通过绑定属性来完成的。

关于ViewModel,视图需要知道的唯一事情是它公开了哪些属性。ViewModel不需要了解视图的任何信息。它们通过这些ViewModel属性通过inotifypropertychanged进行通信,这取决于您如何配置绑定(因此属性值从ViewModel流到View,反之亦然)。

它们之间的另一种常见通信方式是命令,这些命令由html" target="_blank">接口调用以响应某些用户操作(典型的例子是按按钮)。视图还可以通过绑定调用命令,ViewModel可以注册处理程序以对命令调用作出反应。

通过对命令和propertychanged事件作出反应,ViewModel可以充当模型的控制器。您访问模型的方式取决于您的设计,您可以使用一个服务层,该服务层不需要了解您的ViewModel、命令、属性等等。您的ViewModel只是在响应用户操作时与它交互,并更新它自己的属性以通知视图结果。

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

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

编辑回答注释问题

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

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

在大型项目中,Views和ViewModels可能驻留在不同的程序集中。如前所述,ViewModels独立于绑定到它们的视图:它们不需要了解视图的详细信息,这就是它们测试友好的原因。但是,由于它们非常紧密地协同工作,所以通常会将ViewModels与视图(及其需求)一起设计,从而具有高度的耦合性,使得它们极不可能被重用(因此,它们最终会出现在同一个程序集中)。

 类似资料:
  • 目前在我们的项目中,我们以以下方式实现了分层架构,其中控制器、服务、存储库被放置在每个特性的相同包中,例如: null null

  • Web服务客户端 web服务客户端可以通过两种方式访问Java EE应用程序。首先,客户端可以访问用JAX-WS创建的web服务。(有关JAX-WS的更多信息,请参阅第19章,使用JAX-WS构建Web服务。)其次,web服务客户端可以调用无状态会话bean的业务方法。web服务客户端无法访问消息bean。 只要使用正确的协议(SOAP、HTTP、WSDL),任何web服务客户机都可以访问无状态会

  • 问题内容: 在我们的旧版Java EE应用程序中,有很多价值对象(VO)类,它们通常仅包含getter和setter,也许和。这些(通常是)要保存在持久性存储中的实体。(为了记录,我们的应用程序没有EJB,尽管将来 可能会 改变,并且我们使用Hibernate来持久化实体。)所有在VO中操作数据的业务逻辑都在单独的类中(不是EJB,只有POJO)。 )。我的OO思维方式对此讨厌,因为我确实相信给定

  • 5.4.1 层次化体系结构 层次化设计是构造复杂系统的一个基本方法,按此方法设计出的系统具有层次化体系结构。现实世界中这种层次化结构俯拾皆是。例如,一幢高楼总是从最底层打基础开始,一层 一层地加高。又如,我国的行政组织具有街道、区、市、省、中央这样的层次化结构。 计算机软件的各个构件也经常组织成这样的层次体系结构。在层次体系中,下层构件为 上层构件提供服务,上层构件使用下层构件的服务,上层和下层之

  • 通过调用API接口,将企业已有应用接入企业微信,并展示在工作台中,供成员使用。 创建应用 1 / 创建新的应用 01/02在【管理后台】>【企业应用】> 【自建应用】中选择【+创建应用】。 02/02完成应用logo/应用名称/应用介绍/可见范围等基本设置。 2 / 接口设置 创建应用后,根据应用将满足的办公场景,选择不同的API接口。目前支持: 发送消息/接收消息/自动回复 网页授权及JS-SD

  • 我们有一个整体系统,我们目前正在使用GRPC将其分解成微服务。目前,我们在C#客户端的单片代码中使用enyim缓存。 是否应该将其移到此服务的gRPC服务代码中?这样,每个服务都有自己的缓存代码。这将导致大量重复的缓存代码。 我们是否应该为缓存相关代码创建dll,并在新的gRPC微服务中使用它?我们仍然需要在每个gRPC服务中放置重复配置。 只从单片代码处理缓存,并且只在缓存丢失的情况下调用gRP