6

在几个示例项目中,我看到了 ViewModels 用于将数据对象转换为字符串,以便在视图中使用。

ViewModel 通常有一个构造函数,它接收一个参数——一个数据对象。然后构造函数将填充 ViewModel 的各种属性(主要是字符串和整数)。

这可以防止视图中出现任何复杂的逻辑。

乍一看,这对我来说似乎是个好主意,因为它更充分地强制将视图与复杂逻辑分离。

例如,假设我的视图试图呈现数据对象的属性“大小”,大小是 1 到 3 之间的数字,表示“小/中/大”。

我的视图中没有 if/switch 语句,而是在我的 ViewModel 中有一个“SizeString”或类似的东西,并且 if/switch 语句将进入 ViewModel 构造函数。

有人不同意这种方法吗?

使用其他方法会更好吗,例如助手?如果是这样,为什么?

4

2 回答 2

6

ViewModel 的目的是将复杂的域模型(的一部分)表示为可以以其他某种形式呈现的原语。

这种分解必须发生在某个地方。它可能涉及一些简单的逻辑,例如我最喜欢的示例:将离散值(OKwarningerror)转换为颜色(Green、Yellow、Red)。这是 ViewModel 的本质,所以我的默认方法是将这个逻辑封装到 ViewModel 本身中。

考虑替代方案:如果没有在 ViewModel 中实现,那么在哪里?如果你把逻辑放在其他地方,你最终会得到一个基本上只是一个没有逻辑的结构的 ViewModel。让 ViewModel 封装领域对象的转换/分解非常符合单一职责原则

尽管这是我的默认方法,但我始终意识到逻辑可能需要跨多个 ViewModel 重用。在这种情况下,这可能表明原始 ViewModel 实际上是由多个子视图组成的复杂 ViewModel。在这种情况下,您可以将通用逻辑提取到仅封装那一小部分的子 ViewModel 中。

于 2010-01-02T10:03:41.273 回答
2

它将所有内容都转换为字符串,因为 Web 中的所有内容都是字符串。

基本上 - 视图模型应该处于“准备输出”状态。如果网络仅由数字组成 - 我们会将所有内容转换为整数/小数。

Whole point of viewModel - 格式化可表示的数据。在您的情况下 - 将枚举大小设置为小/中/大。这并不是说从视图中分离逻辑使其有价值 - 它能够以一种方式,一个地方熟练地处理您的网络数据。


回复评论=>

是的,坐得很好。我也在做同样的事情。但值得一提的是——我也不反对将其纳入观点。因为视图和视图模型在“依赖链”中是最后的。我非常务实并且完全反对开发人员使用域模型作为视图模型并且视图模型的要求与域模型发生冲突的情况(即,当开发人员仅为表示目的添加新的“域对象”时)。

于 2010-01-02T09:47:53.063 回答