为了账号安全,请及时绑定邮箱和手机立即绑定

我们可以只使用 DTO 而不是 ViewModel 吗?

我们可以只使用 DTO 而不是 ViewModel 吗?

C#
PIPIONE 2021-07-06 17:48:00
我们目前使用 DTO 进行 Web API 请求和响应并使用 ViewModel 将数据传递给 MVC 中的 View目前,我们有:DTO 作为一个单独的项目ViewModel 位于 UI 项目中(与 Controllers 一起的另一个文件夹)我在我们的案例中看到的唯一区别是 DTO 必须通过线路传递并作为 JSON 发送,而 ViewModel 必须在视图内部传递才能呈现为 HTML。我们应该为 MVC 应用程序和我们的应用程序/其他客户端维护单独的传输对象,还是仅通过 DTO 来完成这两项工作,即在 View 而不是 ViewModel 中传递 DTO?它可能有什么缺点?我在这里阅读了很多回复,但没有示例和令人信服的理由在我们的案例中保留单独的 ViewModel 和 DTO。
查看完整描述

3 回答

?
DIEA

TA贡献1820条经验 获得超2个赞

我可以分享我在项目中实施这种模式的经验。将该项目视为分布式架构的简单CRUD应用,分为三种方案:

  • Project.Web(MVC 应用程序)

  • Project.DTO(普通 C# 类)

  • Project.API(Web API 应用程序)

Project.Web 包含应用程序的 UI 逻辑,并且所有 CRUD 操作都依赖于 Project.API,因为与数据库相关的操作是在 Project.API 中执行的。

现在来了 Project.DTO,它包含普通的 C# 类,用于来回传输数据。

Project.Web <---> Project.API

为了使其更具分布式,我创建了 Project.DTO 作为 Nuget 包并将其托管在 Artifactory(您可以使用 Nuget 或任何其他存储库)并使用 Nuget 包管理器使用它。这种方法的主要优点是 DTO 类始终是版本化的并且易于使用。

关于保持 View Model 和 DTO 分开的问题,我可以看到以下几点支持它:

  • 从 API 到 Web 的数据传输,反之亦然:它可能很大而且很复杂。假设我的应用程序想要创建一个客户端并将其所有详细信息添加到数据库中,例如客户端地址、客户端通信、客户端历史记录等。在 Project.Web 中,我们可以拥有其他详细信息,例如会话相关数据、需要的 UI 特定数据不需要从 Web 传输到 API。因此,创建一个单独的 DTO 是有意义的,只传输 Web 和 API 通用的并且独立于项目的数据。

  • 对 API 或 Web 的传入请求:假设我已经创建了一个移动应用程序并准备使用 Project.API。如果我没有创建单独的视图模型和 DTO,我应该将我的视图模型公开给客户端(移动应用程序),这是不可取的,因为它可能包含应该保密的敏感字段。

  • 关注点分离:保持 DTO 仅用于传递数据,对于应用程序中的任何其他进程,请使用 ViewModel。保持关注点分离原则。

这些是我能想到的与您的问题相关的几点。


查看完整回答
反对 回复 2021-07-10
  • 3 回答
  • 0 关注
  • 304 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信