MVVM在Model或ViewModel中计算字段

本文关键字:计算 字段 ViewModel Model MVVM | 更新日期: 2023-09-27 18:03:02

我试图确定处理MVVM中计算字段或方法的正确模式。我有许多表示层和一些后端处理都需要的计算字段。假设它是"CalculateTotal",它基于来自Data对象及其子对象的许多不同值的求和。

我想把这个计算放在一个位置。第一个想法是它属于模型(即,不是viewModel),因为模型对象将被传递给其他后端处理系统。那么,使ViewModel可用的最佳方法是什么?

选项1,是我静态加载viewModel时,我创建它基于Model(例如,vwModel.Total = model.CalculateTotal())如果我需要动态地更新ViewModel,例如,我修改底层数据并尝试获得新的总数,这就会受到影响。

选项2:更加面向服务,每个计算调用一个服务来返回值。我看到的问题更多是基于性能的。一旦加载对象一次,就拥有了执行计算所需的所有数据。似乎每次调用都需要重新加载数据对象

选项3:让ViewModel包含数据模型并创建方法来调用数据模型方法

想法吗?建议吗?

MVVM在Model或ViewModel中计算字段

我将在模型中进行所有计算。视图模型应该订阅模型上的事件(例如通过INotifyPropertyChanged),所以当后端值改变时,视图模型将得到通知。

当然,视图模型可以询问模型以进行计算,而不必通过事件获取所有信息。以上仅适用于数据更改直接来自模型或底层数据层的情况。

我会选择选项2。将计算逻辑移出模型和视图模型将简化事情,并使该逻辑更容易被其他类重用。从你的问题来看,你似乎已经有了如何实现这一点的想法。让模型保持"哑"状态,并拥有知道如何处理模型的服务/实用工具/助手类,从长远来看,如果模型被大量传递,将会对您有所帮助。这只是一些需要考虑的事情,但是保持类的责任非常有限,这使得以后的代码维护更容易。你最终可能会有更多的课程,但我个人认为专注于两到三个小班比专注于一个大班更容易。我不知道你有什么类型的应用程序,也不知道计算有多繁重,但除非你有可测量的性能问题,否则我不会担心尝试预优化的事情。

我想把这个计算放在一个位置。

如果有专用的Service Layer,那么几乎所有的计算都应该在Service Layer中完成。

选项1

与其在Model上使用CalculateTotal方法,不如创建一个只读属性Total,并在每次请求Model时在服务层方法中计算它。如果没有性能问题,这是最简单和最好的选择,因为它极大地简化了ViewModel。

选项2

如果计算过程是资源密集型的,并且每次请求Model时不使用计算总数,则只能从ViewModel调用专用的CalculateTotal服务方法。