Asp.net web api Web API是否需要有ViewModels图层类?

Asp.net web api Web API是否需要有ViewModels图层类?,asp.net-web-api,asp.net-mvc-5,viewmodel,dto,Asp.net Web Api,Asp.net Mvc 5,Viewmodel,Dto,当我使用Web(MVC)时,我总是需要创建一个单独的类层。这些类通常与DTO类相同,但具有类似于[Display(Name=“Street”)]和验证的属性。但对于web api显示属性不是必需的,FluentValidation可以使用验证。Api控制器应该返回ViewModels类还是DTO类也可以?实际上,它取决于应用程序的体系结构,我们希望如何返回响应。在这种情况下,是的,我们可以返回DTO类,但我认为这不是一个好方法,因为我们应该创建一个单独的资源类,该类将映射DTO,然后返回。请参见

当我使用Web(MVC)时,我总是需要创建一个单独的类层。这些类通常与DTO类相同,但具有类似于
[Display(Name=“Street”)]
和验证的属性。但对于web api显示属性不是必需的,FluentValidation可以使用验证。Api控制器应该返回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映射到资源对象。
而且通过这个实现,我们可以独立地测试资源

答案一如既往。。。。视情况而定

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

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

如果您的ViewModels完全相同,并且您只有一个客户机,那么您是否希望创建一组重复的类,以避免具有属性,这取决于您自己

从DTO到ViewModel和viceversa的映射并不复杂,但这个过程确实引入了一个更复杂的层次

但别忘了一件事。API DTO应该返回他们在任何实体上的数据,而不管任何UI的要求如何。需求可以随时更改,添加或丢弃新字段。当这种情况发生时,您很可能不使用API,只需更改ViewModels即可

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


我投票赞成将ViewModels和DTO分开,即使此时它们完全相同。事情总是在变化,这是您可以真正准备好的事情之一。

在我看来,返回的Dto将具有相同的JSON格式(不取决于
[JsonObject]
属性)。当然,当返回的模型与DTO模型不同时,最好创建视图模型,但当返回的模型相同时。。。创建viewModel的原因是什么
[JsonObject]
属性是一个原因,但在我们的案例中,这个属性没有任何意义……事实上,我已经根据我当前的应用程序给出了答案,我们有一个产品支付网关,我们在其中为我们的商家提供REST API,我们正在使用微服务体系结构,因此我们创建了一个公共资源(即ViewModels)这是由多个微服务共享的(以实现DRY原则),是的,您是对的,在您的案例中[JsonObject]没有任何用处。那么,拥有这些资源类有什么好处呢?另外,当你说你独立测试资源时,你的意思是什么?资源是一个简单的类,没有任何功能,那么您到底在测试什么?因此,您建议始终使用VM for MVC,并使用DTO for API?确切地说,它引入了一个分离层,允许您添加多个客户端,所有客户端都使用DTOSAPI,但API也是一个客户端层:)