首页 > 解决方案 > Web API 是否需要有 ViewModels 层类?

问题描述

当我使用 Web (MVC) 时,我总是创建一个单独的类层。这些类通常与 DTO 类相同,但具有类似[Display(Name = "Street")]和验证的属性。但是对于 web api 显示属性不是必需的,可以通过 FluentValidation 使用验证。Api 控制器是否应该返回 ViewModels 类或 DTO 类也可以?

标签: asp.net-web-apiasp.net-mvc-5viewmodeldto

解决方案


答案一如既往是....这取决于。

如果您的 API 服务于多个客户端、应用程序等,那么返回 DTO 是一个更好的选择。

ViewModel 是特定于 MVC 客户端的,应该已经准备好显示,这意味着数据应该已经以特定方式格式化,一些字段可以组合,它们应该满足显示页面的任何要求。出于某种原因,它们被称为 ViewNode。关键是它们很少与 API 返回的数据完全相同,这应该更通用一些,并遵循一定的模式以使其对用户有意义。

如果您的 ViewModel 完全相同并且您只有一个客户端,那么您是否要创建一组重复的分类只是为了避免具有属性,这取决于您。

从 DTO 到 ViewModel 的映射以及反之亦然并不复杂,但该过程确实引入了更多的复杂性,更多的层。

不过不要忘记一件事。无论任何 UI 的要求如何,API DTO 都应该返回它们在任何实体上的数据。无论如何,需求可能会发生变化,添加或丢弃新字段。发生这种情况时,您很可能不理会 API,而只需更改您的 ViewModel。

您的 ViewModel 特定于 UI 页面,并且应该只包含该页面所需的数据。这意味着您最终可以为相同的数据使用多个 ViewModel,只是每个的显示要求不同。

我的投票倾向于保持 ViewModel 和 DTO 分开,即使此时它们完全相同。事情总是在变化,这是您实际上可以准备好的事情之一。


推荐阅读