在不一定类似于 DTO 的 WPF MVVM 视图中使用服务器获取的 DTO 数据

Using server-fetched DTO data in WPF MVVM views that don't necessarily resemble DTOs

我正在开始使用 MVVM Light Toolkit 的 WPF MVVM 项目。我在客户端的服务消耗一些外部 Restful APIs.

到目前为止,这是我将服务器数据传输到视图的总体计划,我想知道它是否需要更改:

我将在我的项目中创建一些 DTO classes,它们完全类似于我将从 API 中获得的内容,并将它们命名为 EntityName,当我从 API 我使用 JsonConvert 用获取的数据填充它们。同样对于我的 View 中的 classes 或更好地说我的 classes 将用于 ViewModel 我将创建一些特定于视图的 classes 并将它们命名为EntityNameSketch 应该从对应的 DTO 继承并具有一些计算出的附加属性,例如FullName 或一些 UI 特定的 IsSelected.

现在有几个困难:

  1. 在 MVVM Light 中,模型 classes 应该继承自 ObservableObject,因此我无法同时继承我的 DTO 和 ObservableObject
  2. 如果我选择不从我的 DTO 继承,而是选择一个完全独立的 class,它将由我为每种 DTO 类型创建的一些转换逻辑填充,这是否会增加一个额外的步骤检索到的服务器数据到视图?我的意思是通常 JsonConvert 就足够了,但在这种情况下,我将需要一个额外的转换器。

我愿意接受任何建议,尽管它们看起来与我的建议截然不同!我只是想确定在效率和项目结构逻辑方面这方面的最佳方法是什么,所以当我的项目变得非常大时(见鬼)我不会遇到任何额外的问题。

更新: 我想出了另一个解决方案:只有一个 class 具有 DTO 的属性以及一些所需的附加属性,并使 JsonConvert 忽略添加的属性。为了清楚起见,我将其他属性放在部分 class 中。但是它仍然存在 "DTOs with Observability" 的问题,我认为这不应该发生,因为 DTO 就是 DTO!并且不应该关心视图。

您的 "updated" 解决方案工作得很好,但问题是您实际上是在使服务层依赖于您的视图。我建议的解决方案是,您的服务中有一些类似于 API 对象的 DTO,并且有一些特定于视图的对象旨在满足您的视图的需求,在许多情况下,这些对象几乎具有所有 DTO 属性和更多。那么一种可能的方法是让一些 factory methods for your view-specific objects and name them like "ViewObject.Create". In the Create method then you accept an interface of your DTO and any other paramters needed and by using a library like "AutoMapper" 执行特定于视图的对象创建逻辑。使用这种方法,您的服务层完全不知道您的视图,这是一个很好的做法。