【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; } 
} 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM