【C# 序列化】 数据传输对象 (DTO)

在讨论 .NET 和 C# 中的软件开发时经常出现的两个术语是 DTO 和 POCO。一些开发人员交替使用这些术语。那么,DTO 和 POCO 之间有什么区别?首先,让我们定义每个术语。随着 C# 9、.NET 5 和记录类型越来越流行,我希望能经常将它们用于 DTR。

数据传输对象 (DTO)

DTO 是“数据传输对象”。它是一个目的是传输数据的对象。根据定义,DTO 应该只包含数据,而不是逻辑或行为。如果 DTO 包含逻辑,则它不是 DTO。但是等等,什么是“逻辑”或“行为”?

通常,逻辑和行为是指类型上的方法。在 C# 中,DTO 应该只有属性,并且这些属性应该只获取和设置数据,而不是验证数据或对其执行其他操作。

属性和数据注释呢?

将元数据添加到 DTO 以使其支持模型验证或类似目的并不罕见。这些属性不会向 DTO 本身添加任何行为,而是促进系统中其他地方的行为。因此,它们不会违反 DTO 不应包含任何行为的“规则”。

ViewModel、API 模型等呢?

DTO 一词非常含糊。它只是说一个对象只包含数据,而不是行为。它没有说明其预期用途。在许多架构中,DTO 可以充当多种角色。例如,在大多数具有支持绑定到数据类型的视图的 MVC 架构中,DTO 用于将数据传递和绑定到视图。这些 DTO 通常称为 ViewModel,理想情况下它们应该没有行为,只有按照 View 期望的格式设置数据。因此,在这种情况下,ViewModel 是一种特定类型的 DTO。但是,要小心。然后你不能得出所有 ViewModel 都是 DTO 的结论,因为在MVVM 架构中[1]ViewModel 通常包含大量行为。因此,在做出任何广泛假设之前考虑上下文非常重要。即使在 MVC 应用程序中,有时逻辑也会添加到 ViewModel 中,这样它们就不再是 DTO。

DTO 和 ViewModels

只要可能,请根据其预期用途命名您的 DTO。命名一个类FooDTO并没有说明在应用程序的体系结构中应该如何或在何处使用该类型。相反,更喜欢像FooViewModel.

C# 中的示例 DTO

下面是 C# 中的示例 DTO 对象:

public class ProductViewModel 
{ 
  public int ProductId { get; set; } 
  public string Name { get; set; } 
  public string Description { get; set; } 
  public string ImageUrl { get; set; } 
  public decimal UnitPrice { get; set; } 
} 

 

posted @ 2022-03-05 21:32  小林野夫  阅读(2769)  评论(1编辑  收藏  举报
原文链接:https://www.cnblogs.com/cdaniu/