POCO =普通旧CLR(或更好:Class)对象

DTO =数据传输对象

在这篇文章中有一个区别,但是坦率地说,我读过的大多数博客都以定义DTO的方式描述了POCO:DTO是用于在应用程序各层之间移动数据的简单数据容器。

POCO和DTO是同一件事吗?


#1楼

POCO只是一个不依赖外部框架的对象。 是平原。

POCO是否具有行为无关紧要。

DTO可能是POCO,领域对象也可能是POCO(通常行为丰富)。

通常,DTO更有可能出于序列化目的而依赖于外部框架(例如,属性),因为它们通常会在系统边界处退出。

在典型的Onion风格的体系结构(通常在广泛的DDD方法中使用)中,域层位于中心,因此此时其对象不应在该层之外具有依赖关系。


#2楼

甚至不称它们为DTO。 他们被称为模型 ...。 模型永远不会有行为。 我不知道是谁提出了这个愚蠢的术语DTO,但我能弄清楚它一定是.NET。 考虑一下MVC中的视图模型,同样重要的是,模型用于在服务器层之间或整个线路周期之间传输状态,它们都是模型。 带有数据的属性。 这些是您通过电线的模型。 模型,模型模型。 而已。

我希望愚蠢的术语“ DTO”能摆脱我们的词汇量。


#3楼

我为该主题写了一篇文章: DTO vs Value Object vs POCO 。

简而言之:

  • DTO!=值对象
  • DTO⊂POCO
  • 值对象⊂POCO

#4楼

DTO类用于对来自不同来源的数据进行序列化/反序列化。 当您想从源中反序列化对象时,与服务,文件,数据库等外部源无关,您可能只想使用其中的一部分,但是您想要一种简单的方法将数据反序列化为对象。宾语。 之后,将数据复制到要使用的XModel。 串行器是一种加载DTO对象的漂亮技术。 为什么? 您只需要一个函数即可加载(反序列化)对象。


#5楼

TL; DR:

DTO描述了状态转移的模式。 POCO没有描述任何内容。 这是在OOP中说“对象”的另一种方式。 它来自由马丁·福勒(Martin Fowler)创造的POJO(Java),实际上,它只是将其描述为“对象”的更奇特的名字,因为“对象”不是很性感。

DTO是一种对象模式,用于在相关层之间转移状态。 他们可以有行为(即从技术上讲可以是poco),只要该行为不会改变状态即可。 例如,它可能具有序列化自身的方法。

POCO是一个普通的对象,但是“普通”的含义是它并不特殊。 这只是意味着它是一个CLR对象,没有隐式模式。 通用术语。 它不是与其他框架一起使用的。 因此,例如,如果您的POCO的所有属性都具有[JsonProperty]或EF装饰,那么我会认为它不是POCO。

这里有一些不同种类的对象模式的例子进行比较:

  • 视图模型 :用于为视图数据建模。 通常具有数据注释以帮助绑定和验证。 在MVVM中,它还充当控制器。 不仅仅是DTO
  • 值对象 :用于表示值
  • 聚合根 :用于管理状态和不变式
  • 处理程序 :用于响应事件/消息
  • 属性 :用作装饰来处理横切关注点
  • 服务 :用于执行复杂的任务
  • 控制器 :用于控制请求和响应的流程
  • 工厂 :用于配置和/或组装复杂的对象,以在构造函数不够好时使用。 还用于确定在运行时需要创建哪些对象。
  • 存储库/ DAO :用于访问数据

这些都是对象,但请注意,它们中的大多数通常与某个模式相关联。 因此,您可以将它们称为“对象”,也可以更具体地说明其意图,并按其含义进行称呼。 这也是我们拥有设计模式的原因。 在一些作品中描述复杂的概念。 DTO是一种模式。 聚合根是一个模式,视图模型是一个模式(例如MVC和MVVM)。 POCO不是模式。

POCO没有描述模式。 这只是在OOP中引用类/对象的另一种方式。 将其视为一个抽象概念; 他们可以指任何东西。 IMO,这是一种单向关系,因为一旦对象到达只能清洁地用于一个目的的位置,它就不再是POCO。 例如,一旦用装饰标记了您的类以使其可以在某些框架上使用,则它不再是POCO。 因此:

  • DTO是POCO
  • POCO不是DTO
  • 视图模型是POCO
  • POCO不是视图模型

区分两者的重点在于保持模式清晰一致,以免引起关注并导致紧密耦合。 例如,如果您有一个具有更改状态方法的业务对象,但还使用EF装饰修饰到地狱,以保存到SQL Server和JsonProperty,以便可以通过API端点发送回该对象。 该对象将不能容忍更改,并且可能会被各种属性(例如,UserId,UserPk,UserKey,UserGuid)填充,其中一些标记为不保存到数据库,而另一些标记为不序列化到API端点处的JSON)。

因此,如果您要告诉我的是DTO,那么我可能会确保除了将状态转移之外,它从未被用于其他任何用途。 如果您告诉我某些东西是视图模型,那么我可能会确保它没有保存到数据库中。 如果您告诉我某些东西是域模型,那么我可能会确保它不依赖于域之外的任何东西。 但是,如果您告诉我某事是POCO,那么您根本不会告诉我太多。


#6楼

POCO遵循OOP规则。 它应该(但不是必须)具有状态行为。 POCO来自POJO,由Martin Fowler [杜撰故事在这里 。 他使用术语POJO来使拒绝框架繁重的EJB实现更加性感。 POCO应该在.Net中的相同上下文中使用。 不要让框架决定对象的设计。

DTO的唯一目的是转移状态,并且不应有任何行为。 有关使用此模式的示例,请参见Martin Fowler 对DTO的解释 。

区别在于: POCO描述了一种编程方法 (老式的面向对象编程),其中DTO是一种用于使用对象“传输数据” 的模式

虽然您可以将POCO像DTO一样对待,但是这样做会冒创建贫血域模型的风险。 此外,由于DTO应该被设计为传输数据,而不是代表业务域的真实结构,因此结构上存在不匹配。 这样的结果是DTO往往比您的实际域平坦。

在任何合理复杂性的域中,几乎总是最好创建单独的域POCO并将其转换为DTO。 DDD(域驱动设计)定义了反腐败层 ( 此处是另一个链接,但最好的办法是购买书 ),这是一个很好的结构,可以使隔离清晰。


#7楼

我认为DTO可以是POCO。 DTO更多关于对象的使用,而POCO更多关于对象的样式(与体系结构概念脱钩)。

当您在域模型/业务逻辑模型中谈论POCO时,POCO与DTO有所不同的一个例子是,它很好地表示了您的问题域。 您可以在整个应用程序中使用POCO,但这可能会带来一些不良的副作用,例如知识泄漏。 例如,DTO是从与UI进行通信的服务层使用的,DTO是数据的平面表示,并且仅用于为UI提供数据,并将更改传达回服务层。 服务层负责将DTO的两种方式映射到POCO域对象。

Update Martin Fowler 说 ,这种方法是繁重的,只有在域层和用户界面之间存在重大不匹配的情况下,才应采用这种方法。


#8楼

DTO的主要用例是从Web服务返回数据。 在这种情况下,POCO和DTO是等效的。 从Web服务返回POCO时,POCO中的任何行为都将被删除,因此,是否具有行为并不重要。


#9楼

这是一般规则:DTO ==邪恶和过度设计的软件的指示器。 POCO ==好。 “企业”模式破坏了Java EE世界中许多人的大脑。 请不要在.NET land中重复该错误。


#10楼

因为我已经在博客文章中表达了自己的立场,所以对我来说可能是多余的,但是该文章的最后一段总结了这一点:

因此,总而言之,学习爱POCO,并确保您不会散布任何与DTO相同的错误信息。 DTO是简单的数据容器,用于在应用程序的各层之间移动数据。 POCO是成熟的业务对象,其一个要求是持久性忽略(没有获取或保存方法)。 最后,如果您还没有签出吉米·尼尔森(Jimmy Nilsson)的书,请从您当地的大学图书馆中取书。 它具有C#中的示例,并且读起来很不错。

顺便说一句,帕特里克·帕特里克(Patrick)我读了POCO的《生活方式》一文,我完全同意,那是一篇很棒的文章。 实际上,这是我推荐的Jimmy Nilsson书中的一部分。 我不知道它可以在线获得。 他的书确实是我在POCO / DTO /存储库/和其他DDD开发实践中找到的最佳信息来源。

普通的旧CLR对象与数据传输对象相关推荐

  1. 复杂类型java对象 — dto数据传输对象

    dto(Data Transfer Object)是一个特殊的java bean,名为:数据传输对象.dto对象是对原始对象的扩展,用于数据的保存和传递. 在项目开发时,一般会涉及到多个对象数据的保存 ...

  2. DTO数据传输对象详解

    文章目录 一.DTO是什么? 二.DTO解决的问题 三.代码演示 一.DTO是什么? DTO (数据传输对象) 数据传输对象(DTO),是一种设计模式之间传输数据的软件应用系统.数据传输目标往往是数据 ...

  3. 分布式应用架构中的数据传输对象(DTO)

    分布式应用架构中的数据传输对象(DTO) Written by: Rickie Lee Dec. 1, 2004 在分布式架构中,相关层在物理部署上实现分离,通过网络或跨进程调用远程对象或服务.在这种 ...

  4. 为什么需要DTO(数据传输对象)

    DTO即数据传输对象.之前不明白有些框架中为什么要专门定义DTO来绑定表现层中的数据,为什么不能直接用实体模型呢,有了DTO同时还要维护DTO与Model之间的映射关系,多麻烦. 然后看了这篇文章中的 ...

  5. MapStruct解决数据传输对象转换的繁琐

    每层有自己的数据传输对象,当数据流程到该层由需要将数据转成符合要求的格式,比如:当数据由应用层流转到服务层则需要将数据转成DTO格式,当数据由服务层流向持久层则需要将数据转成Entity格式数据 下边 ...

  6. Spring Boot笔记-对dto数据传输对象及物联网公司主创建主键的认识

    目录 基本概念 相关代码 基本概念 dto指:data transfer object,数据传输对象. 以本人目前的Java web水平,对此dto有如下的认识. 数据库列映射为java类的时候,如果 ...

  7. 我们为什么需要DTO(数据传输对象)

    DTO即数据传输对象.之前不明白有些框架中为什么要专门定义DTO来绑定表现层中的数据,为什么不能直接用实体模型呢,有了DTO同时还要维护DTO与Model之间的映射关系,多麻烦. 然后看了这篇文章中的 ...

  8. DTO(数据传输对象)模式

    0. 写在前面 首先,这是一篇翻译文章,个人建议你可以阅读英文原文Baeldung: The DTO Pattern (Data Transfer Object),因为个人水平,很多地方翻译的不通顺和 ...

  9. ABP 详解系列2:解析ABP框架中的数据传输对象与应用服务

    解析ABP框架中的数据传输对象与应用服务 ABP框架是基于ASP.NET的Web开发框架,在ABP中应用服务将领域逻辑暴露给展现层,展现层通过传入数据传输对象参数来调用应用服务,而这里我们就来解析AB ...

最新文章

  1. KDE与GNOME的战争史(转载)
  2. Python相关系数矩阵热力图(二)
  3. DCMTK:OFOptional的单元测试
  4. 在maven中开发Spring需要的jar依赖
  5. 新建WindowsPhone项目时提示未将对象引用设置到对象的实例
  6. 诗意的边缘(PHP顶级框架Zend Fr
  7. Front: 电子邮件通讯创业新模式
  8. 芯片厂商的电机控制方案
  9. 大巧不工,袋鼠云正式开源大数据任务调度平台——Taier(太阿)
  10. python3获取天气预报
  11. NKOJ 5140 大吉大利 晚上吃鸡
  12. 使用C语言求斐波那契(Fibonacci)数列的第n项
  13. 2019 My excel
  14. 大公司用的企业网盘哪个好
  15. 使用Qt Quick创建你的塞班手机程序(一)
  16. 浅析向上转型和向下转型
  17. 渐变折射率(GRIN)镜头的建模
  18. Kotlin成为Android开发首选语言——你绝对不能错过的
  19. 基于Python实现相机标定正畸并生成鸟瞰图
  20. 10月11日星期五 恒指/美原油/美黄金 走势分析

热门文章

  1. [置顶] Activity启动流程
  2. android Intent onNewIntent 什么时候调用
  3. android MotionEvent
  4. Android: ListView 和 RecyclerView 对比(一)
  5. vbox 设置linux共享文件夹,Windows 7下设置VirtualBox中Linux共享文件夹
  6. 【工具】ApkTools
  7. iOS架构-组件化入门(1)
  8. java webservice接口开发_搭建Soap webservice api接口测试案例系统
  9. 【Learning Spring 5.0】001 Spring架构及Spring介绍
  10. 函数嵌套 lisp表达式求值