当我使用Web(MVC)时,我总是创建一个单独的类层。这些类通常与DTO类相同,但是具有诸如[Display(Name = "Street")]
和验证之类的属性。但是对于Web API的Display属性不是必需的,FluentValidation可以使用验证。 Api控制器应该返回ViewModels类还是DTO类也可以吗?
答案 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与资源对象进行映射。 通过这种实现方式,我们可以独立测试资源