正確理解DTO、值對象和POCO


(此文章同時發表在本人微信公眾號“dotNET每日精華文章”)

今天推薦的文章比較技術化也比較簡單,但是對於一些初學者而言,可能也是容易搞混的概念:就是如何理解DTO、值對象和POCO之間的區別。

所謂DTO就是數據傳輸對象(Data Transfer Object),POCO就是簡單CLR對象(Plain Old CLR Object),概念來源於Java中的POJO;不過值對象(Value Object)並非.NET中的值類型(Value Type)的實例對象,而是領域驅動設計(Domain-Driven Design,DDD)中的概念。那么這三者是什么關系呢?Vladimir Khorikov專門發表了一篇文章來解釋這個問題。

首先,他給它們進行了更加准確的定義:

  • DTO是表示數據的對象,但是其中不包含任何業務邏輯
  • 值對象是一個完整的領域模型,不僅包含數據,還有邏輯
  • 從值對象還引申出實體對象(Entity),實體對象和值對象的概念比較接近,只是實體對象一般會基於標識ID要區分兩個實例
  • POCO概念來源於POJO,POJO概念由Martin Fowler(我還有幸和他一起共進過兩次晚餐)提出,是JavaBeans這種重量級企業構造件對象的對立概念,也即這種類不繼承於任何對象(或者說直接繼承於Object);同理,POCO可以看作是繼承自System.ComponentModel命名空間中的Component對象的對立對象,或者是EF 4.0之前必須繼承於EntityObject基類的實體對象的對立對象。可以說,理解了非POCO的概念,也即理解了POCO概念。
  • 而POCO代表了可以用於領域模型的盡可能簡單的對象,而POCO是可以包含邏輯的。

根據以上定義,我們得到這樣幾個結論:

  • POCO是DTO和值對象的超集
  • DTO不能等同於值對象
  • DTO和值對象都不能有標識Id,而POCO可以有標識Id

你可以“閱讀原文”來查看其中的配圖,對上面的結論更是一目了然。

原文地址:http://enterprisecraftsmanship.com/2015/04/13/dto-vs-value-object-vs-poco/


免責聲明!

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



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