(此文章同時發表在本人微信公眾號“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/