Web API 是否需要具有视图模型层类?



当我使用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。 而且通过此实现,我们可以独立测试资源

相关内容

  • 没有找到相关文章

最新更新