C# 模型或视图模型中的MVVM计算字段?

C# 模型或视图模型中的MVVM计算字段?,c#,asp.net-mvc,mvvm,C#,Asp.net Mvc,Mvvm,我试图确定处理MVVM中计算字段或方法的正确模式。我有许多计算字段,表示层和一些后端处理都需要这些字段。假设它是“CalculateTotal”,它基于对来自数据对象及其子对象的多个不同值求和 我希望在一个位置进行此计算。第一个想法是它属于模型(即,不是viewModel),因为模型对象将传递给其他后端处理系统。那么,将此功能提供给ViewModel的最佳方法是什么 选项1是,当我基于模型创建viewModel时,静态加载它(例如,vwModel.Total=Model.CalculateTot

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

我希望在一个位置进行此计算。第一个想法是它属于模型(即,不是viewModel),因为模型对象将传递给其他后端处理系统。那么,将此功能提供给
ViewModel
的最佳方法是什么

选项1是,当我基于
模型创建viewModel时,静态加载它(例如,
vwModel.Total=Model.CalculateTotal()
) 如果我需要动态地更新
ViewModel
,例如,我修改基础数据并尝试获取新的总计,则会出现这种情况

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

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


想法?建议?

我会做模型中的所有计算。视图模型应订阅模型上的事件(例如,通过
INotifyPropertyChanged
),因此当后端值更改时,将通知视图模型


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

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

我希望在一个位置进行此计算

如果有一个专用的
服务层
,那么几乎所有的计算都应该在
服务层
中完成

选择1

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

选择2


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

我认为选项2是最好的。因为正如你所说,所有的计算都集中在一个地方,这样会更快。此外,您的ViewModel不应该知道任何有关BL计算的信息,它应该只是一个用于存储数据以供查看的plase。这更多地是关于M/VM交互,而不是关于计算字段。我看不出非计算属性有什么不同。Henk,我是如何看待差异的?对于非计算字段,在创建viewModel时,数据可以简单地从一个模型复制到另一个viewModel。我用的是AutoMapper。对于计算字段,要么我必须让viewModel具有计算字段的一次性副本,要么我需要在模型和viewModel中复制计算逻辑我仍然看不到区别-当模型更改时,复制的字段也会过期(在VMs后面)。