Web API是否必须具有ViewModels图层类?

时间:2018-08-23 11:22:10

标签: asp.net-web-api asp.net-mvc-5 viewmodel dto

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

2 个答案:

答案 0 :(得分:1)

答案一如既往……取决于。

如果您的API服务于多个客户端,应用等,则返回DTO是更好的选择。

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

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

从DTO映射到ViewModel,反之亦然,但过程确实引入了另一种复杂性,即一层。

尽管不要忘记一件事。 API DTO应该返回其在任何实体上拥有的数据,而不管任何UI的要求如何。需求可以随时更改,可以添加或丢弃新字段。发生这种情况时,您很可能会不理会API,而只需更改ViewModel。

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

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

答案 1 :(得分:0)

实际上,我们要如何返回响应取决于应用程序的体系结构。在这种情况下,可以返回DTO类,但是我认为这不是一个好方法,因为我们应该创建一个单独的Resource类,该类将与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与资源对象进行映射。 通过这种实现方式,我们可以独立测试资源