MVVM WPF 应用在三层架构中的应用

4
我目前正在使用MVVM设计模式开发企业级WPF LOB桌面应用程序。我的开发机上当前的解决方案结构如下:
  • 主项目 - 包含所有视图(XAML)的WPF应用程序
  • 视图模型 - 包含支持主项目中视图的所有视图模型
  • BLL - 业务逻辑层
  • DAL - 数据访问层 - 连接到MS-SQL服务器并调用存储过程
  • 模型 - 包含所有业务实体
我目前没有使用WCF,因为除了数据库在自己的服务器上之外,一切都驻留在同一台机器上。然而,将来我们计划将代码库分为3个层次。
我遇到的问题是,一位同事坚持认为我们应该按照以下方式将应用程序拆分为3个独立的服务器/机器:
  1. 展示层 - 用户机器上的客户端WPF应用程序(视图)。这也可以是Web客户端应用程序。
  2. 逻辑层服务器 - 视图模型+模型+业务逻辑层+数据访问层
  3. 数据层服务器 - 数据库服务器

我无法想象视图模型视图分开(不同的服务器),但他声称可能会这样。

编辑:我的同事声称,在服务器端拥有视图模型将使任何未来的部署更加容易,并且会使其更可维护,因为更改只会发生在服务器端。然而,我使用ClickOnce部署了.NET应用程序,这并不是一个大问题。

根据我所阅读的内容, 您可以在用户计算机上安装WPF客户端应用程序,其中包含视图和视图模型,然后通过通信层(如WCF)公开较低层的服务。

另一篇帖子中的答案如下所述: "在MVVM中,UI层被分成两个层。ViewModel负责应用程序逻辑,而View仅负责表示。" 基于此,我的根本问题是,View和ViewModel UI层是否可以存在于不同的层(服务器)中?如果可以,是否建议这样做?如何实现?

谢谢!


请注意:"View Model"和"Model"是两个不同的概念。我确定他没有坚持将"View Model"放在与视图不同的机器上。 - Daniel Hilgarth
抱歉,我纠正了一下。是的,他坚持将视图模型放在另一台机器上,这让我非常难以理解!毕竟,我阅读的所有资料中都没有人提出过这个建议。 - Adolfo Perez
3
在这种情况下,问他他如何想象这个工作方式。这是一个糟糕的想法,会使视图模型无用。 - Daniel Hilgarth
3
告诉你的同事他疯了。 - Big Daddy
2
听起来他把MVVM和三层服务器客户端架构混淆了,它们并不完全相同。 - Alan
显示剩余4条评论
2个回答

7
“视图模型”(View Model)是计算机内存中的一个“对象”实例,就像任何其他已实例化的类一样。它的作用是连接视图和模型,访问各种BL方法等等。即使从服务器向客户端传递“视图模型”的实例(例如,在服务器上进行二进制序列化,然后在另一端进行反序列化),这也会导致巨大的开销(无论是在网络还是CPU方面),而且我无法看到它如何使事情更容易,相反,我想了解这将如何使事情更易于维护。视图和视图模型都应该在客户端上。例如:
Presentation Tier - The client WPF application (View + View Models)
Logic Tier server - Model + Business Logic Layer + Data Access Layer
Data Tier server - The database server

在这种分离的情况下,他是正确的,即在BL或DAL中进行的更改不需要创建客户端的新版本(只要您不破坏任何接口,不更改模型等)。


我同意“视图和视图模型都应该在客户端上。” - afruzan

1

让我们从显而易见的地方开始:

  1. ViewModels不在服务器上运行。它们的作用是使来自多个服务/模型的数据可用于视图,并提供视图和数据之间的链接。没有人这样做,也没有人会认为这是一个好主意。永远不会。
  2. 您的数据层可以在您想要的任何地方生存,只需进行最少的干预。

讨论的重点是将多少/少的业务逻辑层移动到WCF层并保留多少在客户端机器上。这就是讨论的内容。

如果您的同事坚持认为viewmodel应该在服务器上,请要求他/她制作原型。这应该非常有趣。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接