精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

聊聊Dto 和 Poco(或 Pojo)有什么區別,你知道嗎?

開發 后端
在討論 .NET 和 C# 中的軟件開發時經常出現的兩個術語是 DTO 和 POCO。一些開發人員交替使用這些術語。那么,DTO 和 POCO 之間有什么區別?首先,讓我們定義每個術語。

本文轉載自微信公眾號「DotNET技術圈」,作者Ardalis Steve 。轉載本文請聯系DotNET技術圈公眾號。

在討論 .NET 和 C# 中的軟件開發時經常出現的兩個術語是 DTO 和 POCO。一些開發人員交替使用這些術語。那么,DTO 和 POCO 之間有什么區別?首先,讓我們定義每個術語。

數據傳輸對象 (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 對象:

  1. public class ProductViewModel 
  2.   public int ProductId { get; set; } 
  3.   public string Name { get; set; } 
  4.   public string Description { get; set; } 
  5.   public string ImageUrl { get; set; } 
  6.   public decimal UnitPrice { get; set; } 

封裝和數據傳輸對象

封裝是面向對象設計的重要原則。但它不適用于 DTO。封裝用于防止類的協作者過于依賴有關類如何執行其操作或存儲其數據的特定實現細節。由于 DTO 沒有操作或行為,并且應該沒有隱藏狀態,因此它們不需要封裝。不要通過使用私有 setter 或試圖讓你的 DTO 表現得像不可變的值對象,從而使你的生活變得更艱難。您的 DTO 應該易于創建、易于編寫和易于閱讀。他們應該支持序列化而不需要任何自定義工作來支持它。

字段或屬性

既然 DTO 不關心封裝,為什么要使用屬性呢?為什么不只使用字段?您可以使用任何一種,但某些序列化框架僅適用于屬性。我通常使用屬性,因為這是 C# 中的約定,但是如果您更喜歡公共字段或有為什么它們更可取的設計原因,您當然可以使用它們。無論您選擇哪種方式,我都會嘗試在您的應用程序中使用字段或屬性時保持一致。有利弊的一些討論在這里[3]。

不變性和記錄類型

不變性在軟件開發中有很多好處,并且在 DTO 中也是一個有用的特性。Jimmy Bogard 寫過關于嘗試在 DTO 中實現不變性的文章[4],而Mark Seeman[5]在對該文章的評論中(以及在上面的堆棧溢出問題中)采用了相反的方法。就我個人而言,我通常不會將 DTO 構建為不可變的,正如您從上面顯示的示例中看到的那樣。不過,這可能會隨著C# 9 及其引入的記錄類型而改變[6]。順便說一下,您可能會看到的另一個首字母縮寫詞是數據傳輸記錄或 DTR。這是使用 C# 9 定義 DTR 的一種方法:

  1. public record ProductDTO(int Id, string Name, string Description); 

當使用記錄類型和上述位置聲明時,會為您生成一個構造函數,其順序與聲明相同。因此,您將使用以下語法創建此 DTR:

  1. var dto = new ProductDTO(1, "devBetter Membership""A one-year subscription to devBetter.com"); 

或者,您可以以更傳統的方式定義屬性并在構造函數中設置它們。另一個新特性是 init-only 屬性,它支持在創建時初始化,但在其他方面是只讀的,保持記錄不可變。一個例子:

  1. public record ProductDTO 
  2.   public int Id { get; init; } 
  3.   public string Name { get; init; } 
  4.  
  5. // usage 
  6. var dto = new ProductDTO { Id = 1, Name = "some name" }; 

C# 記錄類型在使用位置聲明時無需任何特殊努力即可支持序列化。如果您創建自己的自定義構造函數,則可能需要向序列化程序提供一些提示。隨著 C# 9、.NET 5 和記錄類型越來越流行,我希望能經常將它們用于 DTR。

普通舊 CLR 對象或普通舊 C# 對象 (POCO)

一個普通的舊 CLR/C# 對象是一個 POCO。Java 有普通的舊 Java 對象,或 POJO。你真的可以將這些統稱為“Plain Old Objects”,但我猜有人不喜歡產生的首字母縮略詞。那么,一個對象“老舊”是什么意思呢?基本上,它不依賴于特定的框架或庫來運行。一個普通的舊對象可以在您的應用程序或測試中的任何地方實例化,并且不需要涉及特定的數據庫或第三方框架來運行。

通過展示反例來演示 POCO 是最簡單的。以下類依賴于一些引用數據庫的靜態方法,這使得該類完全依賴于數據庫的存在才能發揮作用。它還繼承自(組成的)第三方持久性框架中定義的類型。

  1. public class Product : DataObject<Product> 
  2.   public Product(int id) 
  3.   { 
  4.     Id = id; 
  5.     InitializeFromDatabase(); 
  6.   } 
  7.  
  8.   private void InitializeFromDatabase() 
  9.   { 
  10.     DataHelpers.LoadFromDatabase(this); 
  11.   } 
  12.  
  13.   public int Id { get; private set; } 
  14.   // other properties and methods 

給定這個類定義,假設您想對 上的某個方法進行單元測試Product。你編寫測試,你做的第一件事就是實例化一個新的實例,Product這樣你就可以調用它的方法。并且您的測試立即失敗,因為您尚未為DataHelpers.LoadFromDatabase要使用的方法配置連接字符串。這是Active Record 模式的[7]一個例子,它可以使單元測試變得更加困難。此類不是Persistence Ignorant (PI),[8]因為它的持久性直接融入到類本身中,并且該類需要從與持久性相關的基類繼承。POCO 的一個特點是它們往往對持久性一無所知,或者至少比 Active Record 等替代方法更是如此。

一個示例 POCO

下面是一個產品的普通舊 C# 對象示例。

  1. public class Product 
  2.   public Product(int id) 
  3.   { 
  4.     Id = id; 
  5.   } 
  6.  
  7.   private Product() 
  8.   { 
  9.     // required for EF 
  10.   } 
  11.  
  12.   public int Id { get; private set; } 
  13.   // other properties and methods 

這個Product類是一個 POCO,因為它不依賴第三方的行為框架,尤其是持久化行為。它不需要基類,尤其是另一個庫中的基類。它與靜態助手沒有任何緊密耦合。它可以在任何地方輕松實例化。它比前面的示例更不了解持久性,但它并非完全不了解持久性,因為它有一個無用的私有構造函數聲明。正如您從評論中看到的那樣,私有無參數構造函數之所以存在,是因為實體框架在從持久性讀取類時需要它來實例化類。

為了論證起見,假設這兩個Product類都包含除了顯示的構造函數和屬性之外的具有行為的方法。這些可以在應用程序中用作DDD 實體[9],對系統內產品的狀態和行為進行建模。

POCO 和 DTO

好的,所以我們已經看到 DTO 只是一個數據傳輸對象,而 POCO 是一個普通的舊 C#(或 CLR)對象。但是它們之間的關系是什么,為什么開發人員經常混淆這兩個術語?除了首字母縮略詞的相似性之外,最大的因素可能是所有 DTO 都是(或應該是)POCO。

請記住,DTO 的唯一目的是盡可能簡單地傳輸數據。它們應該易于創建、閱讀和編寫。它們對第三方框架中定義的特殊基類的任何依賴或將它們與某些行為緊密耦合的靜態調用都會破壞使類成為 DTO 的規則。為了成為 DTO,類必須是 POCO。所有 DTO 都是 POCO。

DTO 和 POCO 維恩圖

如果反過來也成立,那么我們可以說這兩個術語是等價的。但我們知道事實并非如此。在前面的代碼示例中,Product使用 Entity Framework 的實體具有私有的 setter 和行為,使其無法成為 DTO。但正如我們所見,它是 POCO 的一個很好的例子。因此,雖然所有 DTO 都是 POCO,但并非所有 POCO 都是 DTO。

References

[1] MVVM 架構中: https://en.wikipedia.org/wiki/Model–view–viewmodel

[2]: https://ardalis.com/static/ef316c071c0c70148e4b0008830eeae1/d52e5/dto-viewmodel-venn.png

[3] 在這里: https://stackoverflow.com/questions/10831314/dtos-properties-or-fields

[4] Jimmy Bogard 寫過關于嘗試在 DTO 中實現不變性的文章: https://jimmybogard.com/immutability-in-dtos/

[5] Mark Seeman: http://blog.ploeh.dk/

[6] C# 9 及其引入的記錄類型而改變: https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-9

[7] Active Record 模式的: https://www.martinfowler.com/eaaCatalog/activeRecord.html

[8] Persistence Ignorant (PI),: https://deviq.com/principles/persistence-ignorance

[9] DDD 實體:

 

https://deviq.com/domain-driven-design/entity : https://ardalis.com/static/517f68e51029cdcba6b2d49ca477b863/7fee5/dto-poco-venn.png

原文鏈接:https://ardalis.com/dto-or-poco/

作者:Ardalis Steve

 

責任編輯:武曉燕 來源: DotNET技術圈
相關推薦

2024-05-27 00:00:00

localhostIPv6IPv4

2022-03-13 18:53:31

interfacetypeTypeScript

2022-06-08 07:34:25

InnoDBdeleteMySQL

2021-02-06 21:57:40

Debug模式Release

2022-08-26 01:41:42

GPUCPU架構

2025-07-10 00:00:00

2018-10-26 10:41:06

ApacheNginx服務器

2024-03-26 00:10:08

預測AI泛化

2024-10-22 09:59:36

虛擬化容器化系統

2024-01-01 08:25:53

ViewSurface框架

2021-01-19 08:09:04

Oracle數據庫權限

2023-04-26 10:21:04

2023-12-07 07:08:09

Angular函數

2023-06-01 08:15:04

CentOS紅帽

2022-02-25 08:06:48

架構

2024-04-30 09:02:48

2023-12-20 08:23:53

NIO組件非阻塞

2023-09-01 07:38:45

ArrayListArrayst實線類

2025-01-09 07:31:39

MySQL字段磁盤

2023-12-29 22:41:12

同步架構業務
點贊
收藏

51CTO技術棧公眾號

亚洲一区免费观看| 老司机免费视频一区二区三区| 精品国产髙清在线看国产毛片| 成人免费观看在线| 日本国产在线| 久久99久久精品欧美| 欧美成人一区二区三区电影| 国产黄色三级网站| 亚洲黑人在线| 欧美日韩国产专区| 国产三级中文字幕| 欧美成人片在线| 国产成人高清在线| 日本高清+成人网在线观看| 国产三级国产精品国产国在线观看| 国产图片一区| 欧美精品自拍偷拍| 成年网站在线免费观看| 日日夜夜天天综合入口| 欧美激情综合五月色丁香| 99视频在线| 97超碰人人草| 久久av一区| 久久人人爽人人爽人人片av高清| 一级片黄色录像| 天海翼亚洲一区二区三区| 日韩无一区二区| 五月婷婷丁香色| 国产欧美一区二区三区精品酒店| 亚洲精品国产成人久久av盗摄| 亚洲a∨一区二区三区| 亚洲国产精品suv| 久久99在线观看| 国产成人精品电影| 在线观看国产亚洲| 99在线精品免费视频九九视| 免费成人高清视频| 中文字幕求饶的少妇| 欧美精品系列| 国产小视频91| 不卡一区二区在线观看| 老牛影视av一区二区在线观看| 欧美一级日韩免费不卡| 欧美一级视频在线| 在线观看亚洲精品福利片| 欧洲激情一区二区| 国产日韩成人内射视频| 中文字幕在线高清| 一本一道久久a久久精品| 欧美日韩精品在线一区二区| 大黄网站在线观看| 亚洲成人自拍网| 国产精品一线二线三线| av岛国在线| 婷婷中文字幕综合| 久久久999视频| 天堂av在线| 欧美性猛交xxxx富婆| 男人透女人免费视频| 中文字幕乱码在线播放| 色噜噜狠狠成人网p站| 久久久久久久少妇| 国产精品亚洲成在人线| 69堂国产成人免费视频| 亚洲AV成人精品| 国产精品色呦| 亚洲色图综合网| 成人免费视频入口| 亚洲成av人片一区二区密柚| 欧美老女人在线视频| 久久成人国产精品入口| 日韩一区二区久久| 日韩免费精品视频| 中文字幕网址在线| 国产传媒日韩欧美成人| 精品一卡二卡三卡四卡日本乱码 | 一区二区三区四区久久| 成人免费网址| 精品久久久久久久久久久久久 | 国产真实乱子伦精品视频| 2019国产精品视频| 午夜激情小视频| 欧美高清一级片在线观看| 在线观看亚洲视频啊啊啊啊| 五月天激情在线| 精品美女永久免费视频| 久久综合久久色| 国产精一区二区| 日韩av网站电影| 中文乱码字幕高清一区二区| 激情欧美国产欧美| 国产精品嫩草影院一区二区| 国产黄a三级三级看三级| 91丨porny丨首页| 杨幂一区欧美专区| 成人一级福利| 欧美久久久一区| 老司机免费视频| 97精品97| 日韩av快播网址| 国产成年妇视频| 久久婷婷色综合| 亚洲精品天堂成人片av在线播放| 国产精品迅雷| 欧美精品一区男女天堂| 久久午夜精品视频| 日韩午夜高潮| av日韩免费电影| h网站视频在线观看| 亚洲图片欧美视频| 中文字幕资源在线观看| 五月国产精品| 久久久久久久亚洲精品| 一区二区三区午夜| 久久精品一区二区三区不卡牛牛| 成年人视频大全| 少妇高潮一区二区三区99| 日韩精品一区二区三区第95| 久久久久亚洲AV成人| 久久精品久久99精品久久| 久久综合色一本| 里番在线播放| 日韩视频在线观看一区二区| 国产大屁股喷水视频在线观看| 中文一区二区| 国产青春久久久国产毛片| a视频在线播放| 欧美性大战久久| 国产成人av一区二区三区不卡| 亚洲二区免费| 成人资源av| 最新av在线播放| 欧美日韩不卡一区二区| 日韩一区二区a片免费观看| 一区二区福利| 久久国产精品99久久久久久丝袜| 丁香花高清在线观看完整版| 欧美成人aa大片| 私库av在线播放| 国产在线视频一区二区三区| 一区二区三区国| 日韩久久一区| 日韩有码在线电影| 国产精品日韩无码| 亚洲人成在线观看一区二区| 五月天中文字幕在线| 欧美国产一级| 成人a级免费视频| 国产成人午夜| 日韩午夜在线影院| 国产无遮挡又黄又爽在线观看| 成人免费看黄yyy456| 97在线国产视频| 林ゆな中文字幕一区二区| 8x海外华人永久免费日韩内陆视频| 欧美一级视频免费| 天天影视涩香欲综合网| 蜜桃传媒一区二区亚洲av| 久久精品导航| 曰韩不卡视频| 亚洲图色一区二区三区| 久久免费精品视频| 日本大片在线观看| 日本韩国一区二区三区视频| 性猛交ⅹxxx富婆video| 久久66热偷产精品| 97超碰国产精品| 欧美激情影院| 国产精品久久久久久av下载红粉| 日本三级在线视频| 日韩欧美色综合网站| 天天操天天干视频| 中文字幕欧美国产| xxxx国产视频| 国产精品一区亚洲| 在线精品日韩| 狠狠一区二区三区| 国产精品一区=区| 自拍亚洲图区| 亚洲精品一区二区网址| 一级特黄色大片| 亚洲午夜久久久| 国产一二三四五区| 国产精品一区二区无线| 国产毛片视频网站| 日韩欧美网站| 国产精品久久亚洲| 韩国精品主播一区二区在线观看| 精品久久久91| 日韩在线免费看| 欧美丰满嫩嫩电影| 亚洲精品视频在线观看免费视频| 中文久久乱码一区二区| 欧美一级大片免费看| 日韩高清不卡一区二区| 中文字幕日韩精品无码内射| 国模吧精品视频| 成人动漫在线视频| 日本精品另类| 97福利一区二区| 麻豆网站在线免费观看| 亚洲精品小视频| 亚洲精品一区二区三区新线路| 欧美亚洲国产一区二区三区| 国产大片aaa| 国产精品国产三级国产三级人妇| 黄色av网址在线观看| 国产中文字幕一区| 国产一级特黄a大片免费| 激情国产一区| 激情视频小说图片| 青草国产精品| 欧美二区三区在线| 2021年精品国产福利在线| 国产欧美日韩免费| 欧美magnet| 性色av一区二区三区免费| caoporn97在线视频| 中文字幕日韩欧美| 国产资源在线观看| 亚洲精品国产品国语在线| 国产夫妻在线观看| 56国语精品自产拍在线观看| 国产女优在线播放| 在线日韩av片| 日日夜夜操视频| 日韩欧美中文字幕在线观看| 黄网站免费在线| 一区二区三区在线播| 男女性高潮免费网站| 中文字幕一区二区三区四区 | 天天色棕合合合合合合合| 欧美一卡二卡三卡四卡| 国产农村妇女毛片精品| 欧美巨大另类极品videosbest | 国内精品第一页| 手机在线成人免费视频| 日韩高清一区二区| 亚洲少妇第一页| 日韩电影在线免费看| 国产精品亚洲二区在线观看| 视频在线观看一区| 亚洲污视频在线观看| 丝袜美腿高跟呻吟高潮一区| av动漫在线观看| 久久最新视频| 亚洲少妇久久久| 理论片日本一区| 爱豆国产剧免费观看大全剧苏畅 | www.在线视频| 欧美肥臀大乳一区二区免费视频| 超碰人人在线| 欧美激情视频一区二区三区不卡| 污污网站在线观看| 久久久欧美一区二区| 国产福利片在线观看| 欧美在线视频观看| 欧洲成人一区| 国产中文字幕日韩| 亚洲精品v亚洲精品v日韩精品| 91偷拍精品一区二区三区| 都市激情久久| 久久综合狠狠综合久久综青草| 激情综合网五月| 亚洲精品中文字幕乱码三区不卡| 久久社区一区| 青青草视频国产| 18成人免费观看视频| 播放灌醉水嫩大学生国内精品| 久久一二三区| 国产女同无遮挡互慰高潮91| 成人免费毛片高清视频| 麻豆精品免费视频| 亚洲欧洲精品天堂一级| 日本三级理论片| 91久久精品国产91性色tv| 在线视频你懂得| 精品国产乱码久久久久久浪潮| 日韩私人影院| 久久天堂av综合合色| a级大胆欧美人体大胆666| 国产精品av在线播放| 二区三区精品| 久久riav| 91精品秘密在线观看| 免费观看国产精品视频| 蜜臀av一级做a爰片久久| 国产在线观看免费播放| 久久精品亚洲一区二区三区浴池 | 在线观看国产免费视频| 国产精品午夜在线| 国产精品9191| 欧美视频你懂的| 人妻夜夜爽天天爽| xvideos亚洲人网站| 自拍在线观看| 7777精品久久久大香线蕉小说| 婷婷综合电影| 国产午夜精品视频一区二区三区| 午夜亚洲影视| 久久久久亚洲av成人网人人软件| 国产日韩欧美精品电影三级在线 | 日本在线观看网站| 国语自产精品视频在线看一大j8| 成人高清一区| 黄色一区三区| 欧美在线二区| 手机看片一级片| 久久亚洲一级片| 免费一级肉体全黄毛片| 欧美视频在线观看一区二区| 三级毛片在线免费看| 欧美夫妻性视频| 婷婷成人av| 亚洲精品永久www嫩草| 久久经典综合| 国产肉体xxxx裸体784大胆| 一区二区三区精品视频| 国产又粗又猛又爽| 中文字幕在线看视频国产欧美在线看完整| a'aaa级片在线观看| 91日韩在线播放| 欧美日韩老妇| 成年人网站大全| 久久网站热最新地址| 天天插天天操天天干| 精品99一区二区三区| 日韩激情美女| 亚洲综合最新在线| 一区二区三区四区在线观看国产日韩| 午夜国产一区二区三区| 久久久五月婷婷| 五月天激情国产综合婷婷婷| 亚洲国产天堂久久综合| 国内在线免费视频| 不卡视频一区| 国产精品videosex极品| 伊人五月天婷婷| 国产女人aaa级久久久级| 久久精品视频5| 亚洲男人的天堂在线播放| 色老太综合网| 日韩国产高清一区| 免费在线一区观看| 永久免费毛片在线观看| 欧美亚洲日本国产| 欧美午夜电影一区二区三区| 国产精品一区二区三区久久| 日本一区二区在线看| wwwwwxxxx日本| 一区二区三区日韩精品| 性中国xxx极品hd| 韩国欧美亚洲国产| 免费精品国产| 国产三级三级看三级| 亚洲婷婷综合色高清在线| 午夜精品久久久久久久99热黄桃| 欧美激情精品在线 | 亚洲欧美综合一区| 六月丁香婷婷久久| 欧美在线视频第一页| 亚洲成人精品久久久| 自拍偷拍亚洲视频| 一区二区日本| 国产不卡一区视频| 日本熟妇成熟毛茸茸| 亚洲欧美国产精品专区久久 | 日韩亚洲欧美成人一区| 爱草tv视频在线观看992| 欧美一区二区福利| 久久国产欧美日韩精品| 久久久久久福利| 日韩电影免费观看中文字幕| av成人亚洲| 国产 欧美 日韩 一区| 久久色在线视频| 国产精品一二三四五区| 国模gogo一区二区大胆私拍 | bt天堂新版中文在线地址| 91亚洲国产成人精品一区二区三| 一区二区视频免费观看| 欧美高清在线观看| 国产欧美一区二区精品久久久| 日日干日日操日日射| 欧美日韩国产精品| 久草中文在线| 久久99精品久久久久久青青日本| 欧美aaa在线| 国产亚洲色婷婷久久99精品| 亚洲午夜av久久乱码| 日韩成人久久| 十八禁视频网站在线观看| 亚洲乱码国产乱码精品精98午夜| 深夜影院在线观看| 亚洲精品欧美一区二区三区| 亚洲影视综合| 九九九久久久久| 中文国产成人精品久久一| 国产96在线亚洲| 久久久久久久高清|