【发布时间】:2015-11-04 19:57:28
【问题描述】:
我在 WPF 中使用 MVVM 已经有一段时间了。而且我在开发过程中学到了很多东西(从不使用它到开发了几个应用程序)
但是,最近我遇到了一些针对代码的 cmets,这让我想知道我是否以正确的方式做事。我当前的设置(大致)是这样工作的:
- Model - 负责存储数据,使用数据验证 IDataErrorInfo 和脏跟踪
- ViewModel - 负责获取数据(从像 模式)并对其进行格式化以供视图使用(例如 过滤、排序)也负责从 查看(保存、加载、过滤器更改等)
- 视图 - 常见的 UI 内容
现在有人向我提到我应该从不在模型中包含业务逻辑,并且模型应该尽可能薄,视图模型应该负责处理诸如数据验证之类的事情和脏跟踪。
我在这方面看到了 cmets 和批评,人们反对和支持将逻辑放入模型中,我还没有看到这些笼统陈述的任何实际原因。所以我很想知道我是否应该重构我的设置。
此外,鉴于我确实将逻辑移至视图模型,我可以看到需要拥有多个视图模型,而我目前只有一个,例如:
-
Person- 型号 -
PersonViewModel- 处理脏跟踪、数据验证等 -
PersonsViewModel- 处理获取 PersonViewModels 的集合, 过滤等 -
PersonsView- 用户界面
这似乎有点多余,但也许我误解了一些东西。我真正在寻找的是以某种方式执行此操作的一些实际原因,或者这是另一个论点,例如在 MVVM 中使用代码隐藏(纯粹的观点,没有什么理由等)
【问题讨论】:
-
您说 VM 负责获取数据。这可能是真的,也可能不是。这取决于什么最适合您,但 MVVM 设计模式确实指定了它。例如,在创建第一个视图模型之前,您可以在应用程序启动时加载所有数据。或者您可以称您为模型,其中包括来自视图模型的数据访问。
-
这只是我当前的设置,我的视图模型负责与存储库通信,而存储库又与 WCF 服务通信,但我有其他应用程序的工作方式不同。
-
“模型内部永远不会有业务逻辑” - 以前从未听说过与 MVVM 相关的内容;阅读此类文章/讨论会很有趣。
-
在典型的互联网时尚中,我终生无法找到我读过的那篇文章。我可以找到一句话永远不要把它放在视图模型中。虽然我提到接收的 cmets 不在线。