首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ViewModel与业务逻辑的连接

问ViewModel与业务逻辑的连接
EN

Stack Overflow用户
提问于 2013-05-02 20:51:38
回答 4查看 37.9K关注 0票数 60

在使用MVVM模式完成了一些项目之后,我仍然在为ViewModel的角色而苦苦挣扎:

我在过去所做的:仅将模型用作数据容器。将操作数据的逻辑放在ViewModel中。(这就是业务逻辑,对吗?)缺点:逻辑是不可重用的。

我现在尝试的是:让ViewModel尽可能的薄。将所有逻辑移动到模型层中。只在ViewModel中保留表示逻辑。缺点:如果数据在Model层内发生更改,则使UI通知非常痛苦。

为了更清楚起见,我给你举个例子:

场景:重命名文件的工具。Classes: File :表示每个文件;Rule:包含如何重命名文件的逻辑;

如果我遵循的是方法1:创建文件、规则和视图-> RenamerViewModel的ViewModel。将所有逻辑放入RenamerViewModel:包含FileViewModel和RuleViewModel的列表以及后续的逻辑。简单快速,但不可重用。

如果我正在遵循方法2:创建一个新的模型类->重命名程序,它包含一个文件、规则和程序逻辑的列表,以在每个文件上迭代并应用每个规则。为文件、规则和重命名程序创建视图模型。现在RenamerViewModel只包含一个重命名程序模型的实例,外加两个用于包装重命名程序的文件和规则列表的ObservableCollections。但整个逻辑都在重命名模型中。因此,如果通过方法调用触发重命名程序模型来操作某些数据,则ViewModel不知道操作了哪些数据。因为该模型不包含任何PropertyChange通知,我将避免这种情况。因此,业务逻辑和表示逻辑是分开的,但这使得通知UI变得很困难。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-05-02 21:10:17

将业务逻辑放在视图模型中是一种非常糟糕的处理方式,所以我将很快地说永远不要做那个,然后继续讨论第二种选择。

将逻辑放在模型中要合理得多,这是一个很好的开始方法。它的缺点是什么?你的问题是

因此,如果通过方法调用触发重命名程序模型来操作某些数据,则ViewModel不知道操作了哪些数据。因为该模型不包含任何PropertyChange通知,我将避免这种情况。

嗯,让你的模型实现INotifyPropertyChanged肯定会让你转向更好的东西。但是,有时确实无法做到这一点--例如,模型可能是一个分部类,其中的属性是由工具自动生成的,并且不会引发更改通知。这是不幸的,但不是世界末日。

如果你想买东西,那么必须有人付钱;如果不是模型给出了这样的通知,那么你只有两个选择:

视图模型知道模型上的哪些操作(可能)导致更改,并在每个此类operation.

  • Someone知道哪些操作导致更改后更新其状态。
  1. 在包装模型更改后通知视图模型更新其状态。

第一种选择仍然是一个糟糕的主意,因为它实际上又回到了将“业务逻辑”放入视图模型中。不像把所有的业务逻辑都放在视图模型中那么糟糕,但仍然如此。

第二种选择更有希望(不幸的是,还有更多的工作要实现):

  • 将您的部分业务逻辑放在一个单独的类(“服务”)中。服务将实现您希望通过使用模型实例执行的所有业务操作,因为appropriate.
  • This意味着服务知道模型属性何时可能更改(这是OK:模型+服务==业务逻辑)。
  • 服务将向所有相关方提供有关更改的模型的通知;您的视图模型将依赖于服务并接收这些通知(因此,当“他们的”模型被updated).
  • Since时,它们将知道业务操作也是由服务实现的,这仍然是非常自然的(例如,当在视图模型上调用命令时,反应将调用服务上的适当方法;请记住,视图模型本身并不知道业务逻辑)。

有关此类实现的更多信息,请参见my answers here和here。

票数 64
EN

Stack Overflow用户

发布于 2013-05-02 21:10:04

这两种方法都是有效的,但还有第三种方法:在模型和VM层之间实现服务。如果您想让您的模型保持沉默,服务可以提供一个与UI无关的中间人,该中间人可以以可重用的方式实施您的业务规则。

,因为模型不包含任何PropertyChange通知,我将避免这种情况

你为什么要回避这个?不要误会我的意思,我倾向于让我的模型尽可能地保持哑巴,但是在你的模型中实现更改通知有时会很有用,而且当你这样做的时候,你只依赖于System.ComponentModel。它完全是UI不可知的。

票数 13
EN

Stack Overflow用户

发布于 2017-08-25 21:14:27

我执行以下操作

使用XAML视图的

  1. 视图仅限
  2. ViewModel,用于处理单击处理程序和创建新视图模型。处理路由事件等。
  3. 模型,它是我的数据容器和有关验证模型数据的业务逻辑。
  4. 服务,它用数据填充模型。例如,调用web服务器,从磁盘加载它,保存到磁盘等。根据示例,我的模型和服务都将实现IPropertyChanged。或者,它们可能有事件处理程序。

任何复杂的应用程序,imo都需要另外一层。我称之为模型+服务,视图,视图模型。该服务抽象您的业务逻辑,并将模型实例作为依赖项或创建模型。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16338536

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档