正确理解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 ...
随机推荐
- Struts2中的异常处理
因为在Action的execute方法声明时就抛出了Exception异常,所以我们无需再execute方法中捕捉异常,仅需在struts.xml 中配置异常处理. 为了使用Struts2的异常处理机 ...
- /etc/resolv.conf overwritten. Redhat/Centos
Prevent /etc/resolv.conf from being blown away by RHEL/CentOS after customizing If you are using RHE ...
- 有关RAVE报表 - 大富翁论坛20050419
部分资料来源于RAVE开发人员指南 ravedevguide5 新闻组News.Nevrona.com RAVE的官方主页 www.nevrona.com/rave KeyLife富翁笔记 作者 ...
- hbase运行shell时ERROR:org.apache.hadoop.hbase.PleaseHoldException: Master is initializing 的解决办法
这个问题困扰了我一天多的时间,百度搜索的前几条的答案也是很扯淡的,说什么把/etc/hosts文件下的127.0.1.1改成127.0.0.1就行了,我也只能呵呵了.今天早上起得很晚,中午迪哥请我们去 ...
- linux文件权限表示及用户权限管理
UNIX/Linux下关于文件执行权限的表示和查看想必是最熟悉不过的,然而你是否真正了解用户文件的权限标识和用户的权限呢? 实际上文件权限标识不仅仅只有U, G, O 11 10 9 8 7 6 5 ...
- 一个CString的实现 拷贝构造函数的应用
class CString { public: CString (char* s); CString(); ~CString(); private: char *str; int len; stati ...
- linux mono环境
安装好 CentOS 6.5 之后 1.更新系统 在命令行下执行 yum –y update 2.安装必要的软件 yum -y install gcc gcc-c++ bison pkgconfig ...
- Thinkphp源码分析系列(一)–入口文件
正如官方文档上所介绍的,thinkphp使用单一入口,所有的请求都从默认的index.php文件进入.当然不是说一定非得从index.php进入,这应该取决于你的服务器配置,一般服务器都会有默认的首页 ...
- 使用PHP导入和导出CSV文件
我们先准备mysql数据表,假设项目中有一张记录学生信息的表student,并有id,name,sex,age分别记录学生的姓名.性别.年龄等信息. CREATE TABLE `student` ( ...
- 系统中定义VOMapping的时候注意大小写
VOMapping中的第一个参数一定要严格按照大小写(缩写的单词容易错): 例如:VO中的定义: private CntVOEnums.EnumIVRStage ivrStage; 实际反射找这个字段 ...