正确理解DTO、值对象和POCO

今天推荐的文章比较技术化也比较简单,但是对于一些初学者而言,可能也是容易搞混的概念:就是如何理解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/

时间: 2024-10-15 21:03:28

正确理解DTO、值对象和POCO的相关文章

正确理解Python函数是第一类对象

正确理解 Python函数,能够帮助我们更好地理解 Python 装饰器.匿名函数(lambda).函数式编程等高阶技术. 函数(Function)作为程序语言中不可或缺的一部分,太稀松平常了.但函数作为第一类对象(First-Class Object)却是 Python 函数的一大特性.那到底什么是第一类对象呢? 函数是对象 在 Python 中万物皆为对象,函数也不例外,函数作为对象可以赋值给一个变量.可以作为元素添加到集合对象中.可作为参数值传递给其它函数,还可以当做函数的返回值,这些特性

实体对象辨析(POCO、Entity、Model、DTO、BO、DO、PO)

POCO (Plain Old CLR Object)源自Java EE编程领域的POJO概念(2000年由Martin Fowler提出)和POTS (Plain Old Telephone Service)概念.POCO被应用于面向.NET框架的CLR (Common Language Runtime, 公共语言运行时).但是POCO本身不依赖于外部框架,它是PLAIN的. POCO的优点: 简单数据存储机制,简化层间数据传递和序列化. 可用于依赖注入和仓库(Repository)模式. 减

从壹开始微服务 [ DDD ] 之八 ║剪不断理还乱的 值对象和Dto

缘起 哈喽大家周四好,时间是过的真快,这几天一直忙着在公司的项目,然后带带新人,眼看这周要过去了,还是要抽出时间学习学习,这些天看到群里的小伙伴也都在忙着新学习,还是很开心的,至少当时的初衷已经达到了,一起学习一起进步嘛,哪怕是对现在或者是对以后的工作有一丢丢的帮助,也是不枉此时的努力,哈哈夜里写文章总是容易多想,好啦,废话不多说,上次咱们说到了<从壹开始微服务 [ DDD ] 之七 ║项目第一次实现 & CQRS初探>,今天本来应该接着写 领域命令 了,在设计的领域命令的时候,发现了

看完这个你还不理解右值引用和移动构造 你就可以来咬我(上)

共分三篇,这是第一篇.另外两篇,看完这个你还不理解右值引用和移动构造 你就可以来咬我(中),看完这个你还不理解右值引用和移动构造 你就可以来咬我(下). C++ 右值引用 & 新特性 C++ 11中引入的一个非常重要的概念就是右值引用.理解右值引用是学习"移动语义"(move semantics)的基础.而要理解右值引用,就必须先区分左值与右值. 对左值和右值的一个最常见的误解是:等号左边的就是左值,等号右边的就是右值.左值和右值都是针对表达式而言的,左值是指表达式结束后依然存

正确理解WPF中的TemplatedParent

(注:Logical Tree中文称为逻辑树,Visual Tree中文称为可视化树或者视觉树,由于名称不是很统一,文中统一用英文名称代表两个概念,况且VisualTreeHelper和LogicalTreeHelper也是WPF中提供的类名称) 众所周知WPF中的Logical Tree是逻辑上定义的元素层次树,而实际上显示在屏幕上的元素层次树是Visual Tree,Visual Tree是 (注:Logical Tree中文称为逻辑树,Visual Tree中文称为可视化树或者视觉树,由于

理解java值传递与引用传递

1.基本类型和引用类型在内存中的保存 Java中数据类型分为两大类,基本类型和对象类型.相应的,变量也有两种类型:基本类型和引用类型.基本类型的变量保存原始值,即它代表的值就是数值本身:而引用类型的变量保存引用值,"引用值"指向内存空间的地址,代表了某个对象的引用,而不是对象本身,对象本身存放在这个引用值所表示的地址的位置. 基本类型包括:byte,short,int,long,char,float,double,Boolean,returnAddress,引用类型包括:类类型,接口类

DDD实战与进阶 - 值对象

目录 DDD实战与进阶 - 值对象 概述 何为值对象 怎么运用值对象 来看一个例子 值对象的持久化 总结 DDD实战与进阶 - 值对象 概述 作为领域驱动设计战术模式中最为核心的一个部分-值对象.一直是被大多数愿意尝试或者正在使用DDD的开发者提及最多的概念之一.但是在学习过程中,大家会因为受到传统开发模式的影响,往往很难去运用值对象这一概念,以及在对值对象进行持久化时感到非常的迷惑.本篇文章会从值对象的概念出发,解释什么是值对象以及怎么运用值对象,并且给出相应的代码片段(本教程的代码片段都使用

如何运用领域驱动设计 - 值对象

原文:如何运用领域驱动设计 - 值对象 目录 概述 何为值对象 值对象是基于上下文的 当前上下文的值对象可能是另一个上下文的实体 怎么运用值对象 尽量避免使用基元类型 值对象是内聚并且可以具有行为 来看一个例子 值对象的持久化 总结 概述 作为领域驱动设计战术模式中最为核心的一个部分-值对象.一直是被大多数愿意尝试或者正在使用DDD的开发者提及最多的概念之一.但是在学习过程中,大家会因为受到传统开发模式的影响,往往很难去运用值对象这一概念,以及在对值对象进行持久化时感到非常的迷惑.本篇文章会从值

领域驱动设计之实体、值对象、领域服务

建立领域模型的第一步就是需要识别出实体.值对象与领域服务. 一.实体 1.实体是领域中需要唯一标识的领域概念.通常在业务中,需要唯一标识与区分的对象并需要持续对它进行跟踪,这样的对象我们认为是实体. 2.如果两个实体所有状态都一样,但如果标识不一样,就是两个不同实体.比如订单对象就应该是实体,就算两个订单的订单日期.订单总额等信息都一样,只要标识不一样,比如订单号,我们就认为它们是不同的实体. 3.实体只保留必要的属性与行为.比如一个客户实体应该保留客户的基本信息,但像国家.省.城市.街道等信息