【发布时间】:2021-10-25 03:10:54
【问题描述】:
我不认为这些是重复的:
- Save and Load data “the MVVM” way? - 谈论“用户设置”而不是模型中的数据
- MVVM Saving in database using ICommand - 谈论我认为的 ICommand 实现的东西
我正在创建一个本地应用程序。用户输入的数据要么存储在本地文件中,要么存储在本地托管的数据库中。我试图弄清楚我应该如何构造数据的保存。如果相关,我希望仅在用户请求保存时才保存数据(即,我不想在每次更改模型中存储的数据时都写入数据库/文件)。
[旁注建议 V、VM 和 M 都保持同步,是吗?您不想只是偶尔更新模型,对吗?]
按照this article 和this question 中的定义,模型包含业务/应用程序逻辑和数据,而视图模型包含表示逻辑并将模型中的数据转换为可展示的形式。管理(例如储蓄)似乎不太适合这两个类别。
问题 1。 如果保存功能(以及在应用程序启动时加载数据)只是在 ViewModel、Model 或其他实体中,则称其为 Controller,因为没有更好的词。
问题 2。 我对 WPF 和 MVVM 都很了解,并且对(/不确定)应用程序结构/架构非常感兴趣。 View 应该如何通知 ViewModel/Model/Controller 用户已请求保存?命令是正确的工具吗(我对命令不熟悉,我刚刚读过一点)。 如果控制器是一个不错的选择,它将具有什么结构,它需要了解哪些 MVVM 组件(或者对所有这些组件都视而不见)。它会在哪里构造(可能在 App.xaml.cs 中?)还是静态对象?
【问题讨论】:
-
通常我将模型视为具有有限逻辑或根本没有逻辑的简单数据对象,并且用于保存/加载模型对象(或模型上的其他操作)的逻辑确实属于一个或多个服务。模型和服务通常构成领域层(或业务层),但我认为模型一词经常在实际数据模型(或数据传输对象,即 DTO)和领域模型/层之间互换使用。
-
View Models 可以通过依赖注入消费服务来带来服务和数据模型。这些服务通常有一个定义良好的接口,它是传递到视图模型或通过依赖注入容器解析的接口。注入接口对于单元测试和从视图模型中抽象出具体实现很重要。例如,您可能有一个 IModelService,它具有将数据模型保存和加载到文件的逻辑。设置 DI 容器通常在应用程序在 App.xaml.cs 中启动时完成
-
为服务定义良好的接口也提供了灵活性,因为可以为不同的行为传入不同的具体实现。例如,您可以拥有一个处理将数据加载/保存到文件的服务,另一个处理保存/加载到数据库的实现,也许还有另一个使用 Web API 的服务。关键是视图模型不知道也不关心服务在做什么——它只知道调用 Save()/Load()。 :)
-
@/coding.monkey 听起来我需要了解依赖注入和制作自己的服务。
-
该模型是 CRUD,但您的数据已公开。可能是某种序列化和反序列化数据的类。您需要从中获取数据并通过它保存数据。这通常涉及某种 DTO。这应该与视图模型分开。 viewmodel 必须实现 inpc 并且可能将数据和命令适应于视图和来自视图。 automapper 通常用于将数据复制到视图模型实例和从视图模型实例复制数据。但这是在您阅读或坚持时完成的。您想要分离关注点,但也因为您只想保留经过验证的数据。
标签: c# wpf mvvm model viewmodel