当我使用Web(MVC(时,我总是创建一个单独的类层。这些类通常与 DTO 类相同,但具有[Display(Name = "Street")]
和验证等属性。但是对于Web api,显示属性不是必需的,FluentValidation可以使用验证。API 控制器应该返回 ViewModels 类还是 DTO 类也可以?
答案一如既往....这要看情况。
如果您的 API 服务于多个客户端、应用程序等,那么返回 DTO 是更好的选择。
ViewModels 特定于 MVC 客户端,应该已经准备好显示,这意味着数据应该已经以特定方式格式化,某些字段可以组合在一起,它们应该满足显示页面的任何要求。它们被称为ViewNodels是有原因的。关键是它们很少与 API 返回的数据完全相同,这些数据应该更通用一些,并遵循某种模式以对其用户有意义。
如果您的 ViewModel 完全相同,并且您只有一个客户端,那么如果您想创建一组重复的分类以避免拥有属性,则由您决定。
从DTO到ViewModel和viceversa的映射并不复杂,但这个过程确实引入了一个复杂的问题,更多的层。
不过不要忘记一件事。API DTO 应该返回它们在任何实体上拥有的数据,而不管任何 UI 的要求如何。无论如何,要求都可以更改,添加新字段或放弃新字段。发生这种情况时,您很可能会不理会 API,只需更改您的 ViewModels。
您的 ViewModel 特定于 UI 页面,并且应仅包含该页面所需的数据。这意味着您最终可以为相同的数据使用多个 ViewModels,只是每个模型的显示要求不同。
我的投票赞成将ViewModels和DTO分开,即使此时它们完全相同。瘦总是在变化,这是您实际上可以准备好的事情之一。
实际上,这取决于应用程序的体系结构,我们希望如何返回响应。在这种情况下,是的,我们可以返回 DTO 类,但我认为这不是好方法,因为我们应该创建一个单独的资源类,该类将与 DTO 映射然后返回。只需查看以下示例:
public class CustomerDTO
{
public int ID { get; set; }
public string Name { get; set; }
public int DepartmentId { get; set; }
}
public class CustomerResource
{
[JsonObject]
public string Name { get; set; }
[JsonObject]
public string Department { get; set; }
}
假设我们有 CustomerDTO 类,我们希望以以下 json 格式返回响应
{
"name":"Abc xyz",
"department":"Testing"
}
因此,在这种情况下,我们应该有单独的类,该类将在我创建CustomerResource时作为对最终用户的响应返回。在此方案中,我们将创建一个映射器,该映射器将使用资源对象映射 DTO。 而且通过此实现,我们可以独立测试资源