提问者:小点点

MVVM:视图模型和业务逻辑连接


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

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

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

因此,我将给你一个例子,让它更清晰:

场景:重命名文件的工具。类:文件:表示每个文件;规则:包含如何重命名文件的逻辑;

如果我遵循方法1:为文件、规则和视图创建ViewModel-

如果我遵循方法2:创建一个新的模型类-


共3个答案

匿名用户

将业务逻辑放入视图模型中是一种非常糟糕的做事方式,所以我将很快地说永远不要这样做,并继续讨论第二种选择。

将逻辑放入模型中更加合理,这是一个很好的开始方法。有哪些弊端?你的问题说

因此,如果Renamer模型被触发以通过方法调用操作一些数据,ViewModel没有任何线索来操作哪些数据。因为模型不包含任何属性更改通知,我会避免这种情况。

好吧,让你的模型实现INotifyProperty tyChanged肯定会让你继续做更好的事情。然而,有时确实不可能做到这一点——例如,模型可能是一个部分类,其中属性由工具自动生成,不会引发更改通知。这很不幸,但不是世界末日。

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

    < Li > viewmodel知道模型上的哪些操作(可能)会导致更改,并在每次此类操作后更新其状态。 < li >其他人知道哪些操作会导致更改,并在viewmodel包装的模型更改后通知viewmodel更新其状态。

第一个选项同样是一个坏主意,因为实际上它会回到将“业务逻辑”放在视图模型中。虽然没有将所有业务逻辑都放在视图模型中那么糟糕,但仍然如此。

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

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

有关这种实现的更多信息,请参见我在这里和这里的回答。

匿名用户

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

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

你为什么回避这个?不要误解我的意思,我倾向于让我的模型尽可能的简单,但是在你的模型中实现变更通知有时是有用的,而且你只依赖于< code >系统。ComponentModel。它完全与用户界面无关。

匿名用户

我执行以下操作

>

  • 仅具有XAML视图逻辑的视图

    处理单击处理程序和创建新视图模型的ViewModel。处理路由事件等。

    模型,它是我的数据容器和验证模型数据的业务逻辑。

    用数据填充模型的服务。例如调用Web服务器、从磁盘加载、保存到磁盘等。根据示例,我的模型和服务通常都会实现IProperty tyChanged。或者他们可能有事件处理程序。

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