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
包含数据模型并创建方法来调用数据模型方法
想法吗?建议吗?
我将在模型中进行所有计算。视图模型应该订阅模型上的事件(例如通过INotifyPropertyChanged
),所以当后端值改变时,视图模型将得到通知。
我会选择选项2。将计算逻辑移出模型和视图模型将简化事情,并使该逻辑更容易被其他类重用。从你的问题来看,你似乎已经有了如何实现这一点的想法。让模型保持"哑"状态,并拥有知道如何处理模型的服务/实用工具/助手类,从长远来看,如果模型被大量传递,将会对您有所帮助。这只是一些需要考虑的事情,但是保持类的责任非常有限,这使得以后的代码维护更容易。你最终可能会有更多的课程,但我个人认为专注于两到三个小班比专注于一个大班更容易。我不知道你有什么类型的应用程序,也不知道计算有多繁重,但除非你有可测量的性能问题,否则我不会担心尝试预优化的事情。
我想把这个计算放在一个位置。
如果有专用的Service Layer
,那么几乎所有的计算都应该在Service Layer
中完成。
选项1
与其在Model
上使用CalculateTotal
方法,不如创建一个只读属性Total
,并在每次请求Model
时在服务层方法中计算它。如果没有性能问题,这是最简单和最好的选择,因为它极大地简化了ViewModel。
选项2
如果计算过程是资源密集型的,并且每次请求Model
时不使用计算总数,则只能从ViewModel
调用专用的CalculateTotal
服务方法。