正确理解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/
正确理解DTO、值对象和POCO的更多相关文章
- DDD 领域驱动设计-Value Object(值对象)如何使用 EF 进行正确映射
写在前面 首先,这篇博文是用博客园新发布的 MarkDown编辑器 编写的,这也是我第一次使用,语法也不是很熟悉,但我觉得应该会很爽,博文后面再记录下用过的感受,这边就不多说. 阅读目录: 上一篇回顾 ...
- Value Object(值对象)如何使用 EF 进行正确映射
DDD 领域驱动设计-Value Object(值对象)如何使用 EF 进行正确映射 写在前面 首先,这篇博文是用博客园新发布的 MarkDown编辑器 编写的,这也是我第一次使用,语法也不是很熟悉, ...
- 从壹开始微服务 [ DDD ] 之八 ║剪不断理还乱的 值对象和Dto
缘起 哈喽大家周四好,时间是过的真快,这几天一直忙着在公司的项目,然后带带新人,眼看这周要过去了,还是要抽出时间学习学习,这些天看到群里的小伙伴也都在忙着新学习,还是很开心的,至少当时的初衷已经达到了 ...
- 正确理解Python函数是第一类对象
正确理解 Python函数,能够帮助我们更好地理解 Python 装饰器.匿名函数(lambda).函数式编程等高阶技术. 函数(Function)作为程序语言中不可或缺的一部分,太稀松平常了.但函数 ...
- 《Entity Framework 6 Recipes》中文翻译系列 (44) ------ 第八章 POCO之POCO中使用值对象和对象变更通知
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 8-4 POCO中使用值对象(Complex Type--也叫复合类型)属性 问题 ...
- DDD 领域驱动设计-“臆想”中的实体和值对象
其他博文: DDD 领域驱动设计-三个问题思考实体和值对象 DDD 领域驱动设计-三个问题思考实体和值对象(续) 以下内容属于博主"臆想",如有不当,请别当真. 扯淡开始: 诺兰的 ...
- DDD 领域驱动设计-三个问题思考实体和值对象(续)
上一篇:DDD 领域驱动设计-三个问题思考实体和值对象 说实话,整理现在这一篇博文的想法,在上一篇发布出来的时候就有了,但到现在才动起笔来,而且写之前又反复读了上一篇博文的内容及评论,然后去收集资料, ...
- Js位置与大小(1)——正确理解和运用与尺寸大小相关的DOM属性
在web开发中,不可避免遇到要计算元素大小以及位置的问题,解决这类问题的方法是利用DOM提供的一些API结合兼容性处理来,所有内容大概分3篇左右的文章的来说明.本文作为第一篇,介绍DOM提供的与尺寸大 ...
- Java进阶(七)正确理解Thread Local的原理与适用场景
原创文章,始自发作者个人博客,转载请务必将下面这段话置于文章开头处(保留超链接). 本文转发自技术世界,原文链接 http://www.jasongj.com/java/threadlocal/ Th ...
随机推荐
- php curl vs python提交多维数组+文件
总结: 1.data数据格式 2.php post 格式无需json_encode(关联数组,所以可以绕弯) 参考:http://bbs.csdn.net/topics/390645553?page ...
- lintcode-【简单题】快乐数
题目: 写一个算法来判断一个数是不是"快乐数". 一个数是不是快乐是这么定义的:对于一个正整数,每一次将该数替换为他每个位置上的数字的平方和,然后重复这个过程直到这个数变为1,或是 ...
- Deep learning with Theano 官方中文教程(翻译)(四)—— 卷积神经网络(CNN)
供大家相互交流和学习,本人水平有限,若有各种大小错误,还请巨牛大牛小牛微牛们立马拍砖,这样才能共同进步!若引用译文请注明出处http://www.cnblogs.com/charleshuang/. ...
- ios category,protocol理解
category: 向现有的类中增加方法,同时提供方法的实现,现有类不需要做任何改动. protocol:(相当于Java或C#中的接口interface,当很多类都要需要类似的方法,但是方法具体实现 ...
- Linux命令之reset - 终端屏幕混乱的终结者
用途说明 reset命令是用来重新初始化终端的(terminal initialization).在有些情况,终端显示会混乱无比,比如不小心显示了一个二进制文件,以前我在不知道reset命令时,只好将 ...
- 《深入浅出 Java Concurrency》
http://www.blogjava.net/xylz/archive/2010/07/08/325587.html
- AX2012 DMF数据导入的问题
由于AX2012的数据结构比较复杂,通过Excel直接导入表的方式很多数据已经难以导入,比如物料信息,2009只需要导入InventTable,InventTableModule和InventItem ...
- 安装和部署ZkeaCMS
ZkeaCMS是基于EasyFrameWork,使用ASP.NET MVC4开发的开源CMS. ZkeaCMS一个内容管理软件(网站).ZkeaCMS不仅只是管理内容,更是重新定义了布局.页面和组件, ...
- ORACLE object_id和data_object_id
object_id和data_object_id 都是对象的唯一标识. object_id是对象的逻辑标识 data_object_id是对象的物理标识 对于没有物理存储的对象,data_object ...
- rotate the clock
A program test: You are given N round clocks. Every clock has M hands, and these hands can point to ...