POCO=普通的老CLR(或更好:类)的对象

也可与检=数据传送对象

在此 是有差别的,但坦率地说,大多数博客我读描述POCO的方式也可与检的定义:交互是简单的数据集装箱用于运动之间的数据层的应用程序。

是POCO,也可与检同样的事情吗?

有帮助吗?

解决方案

POCO遵循规则的面向对象.它应该(但不必)有状态 行为。POCO来自只创造了由马丁*福勒[故事里].他用这个词组作为一种方法来使它更性感到拒绝的框架内重EJB实现。POCO应当使用相同的上下文中。网。不要让框架的决定你的对象是设计。

一个也可与检唯一的目的是要转移的状态,而应该有的行为。看到马丁*福勒的 解释也可与检 对于一个例子使用这种模式。

这里的差别: POCO描述了一个方案编制方法 (好的老式面向对象编程),那里的 也可与检是一个图案 这是用于"传输数据的"使用对象。

而你可以享POCOs喜欢的交互,你冒的风险的创造 贫血的领域模型 如果你这样做。此外,还有不匹配结构,由于交互的设计应将数据传送,而不代表真正的结构的业务领域。结果是,交互倾向于更平比你实际领域。

在一个领域的任何合理的复杂性,你几乎总是更好的创建单独域POCOs和翻译他们的交互.DDD(域驱动的设计)的定义 反腐败层 (另一个链接 在这里,, 但最好的事情要做的就是 买这本书),这是一个良好的结构,使得隔离清楚。

其他提示

这可能是多余的,因为我已经说过在我的博客文章我的位置,我出力,但该文章类型的总和事情的最后一段:

所以,最后,学会爱的POCO,并确保你不传播它是同样的事情作为DTO任何误传。 DTO的是用于一个应用程序的层之间移动数据的简单的数据容器。波苏斯都与一个要求全功能的业务对象,他们是持久性无知(没有get或保存方法)。最后,如果你还没有检查出吉米尼尔森的书呢,从当地大学栈把它捡起来。它在C#中的例子,这是一个伟大的阅读。

顺便说一句,帕特里克我读POCO作为生活方式文章,以及我完全同意,这是一个很好的文章。它实际上是从我推荐的吉米·尼尔森书的部分。我不知道,这是在网上提供。他的书真的是我的POCO / DTO /库/等DDD开发实践中发现的信息的最佳来源。

POCO仅仅是一个对象,该对象不采取在外部框架的依赖性。它是普通纸。

无论POCO具有行为或不它是不重要的。

一个DTO可以是POCO作为可能的域对象(其通常将富含行为)。

通常的DTO更有可能采取串行化的目的上的外部框架的依赖性(例如,属性)作为通常它们出口在系统的边界。

在典型洋葱式结构(通常是一个广义DDD方法中使用)的域层被放置在中心,所以其目的并不,在这一点上,有一个层的外侧的依赖关系。

我为此主题写了一篇文章: DTO、值对象、POCO.

简而言之:

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

我认为一个DTO可以是POCO。 DTO是更多关于该对象的使用,同时POCO是多个对象的样式的(从架构概念去耦)。

一个例子,其中一个POCO的东西比DTO不同的,当你在你的领域模型/业务逻辑模型,这是你的问题域的一个不错的OO表示里面谈论POCO的是。您可以使用POCO的在整个应用程序,但是这可能有一些不良的副作用,知识泄漏。 DTO的是例如从该UI与通信的服务层中使用的,DTO的是数据的平面表示,并且仅用于提供UI数据,和通信变回服务层。服务层是负责DTO的两种方式映射到POCO域对象。

<强>更新马丁福勒所述,这种方法是重型道路取,并且只应是否存在所访问的层和所述用户接口之间的显著失配。

一个主要用例一DTO是在从web服务返回数据。在这种情况下,POCO和DTO是等价的。当从一个Web服务返回的POCO的任何行为将被删除,所以它其实并不重要无论它是否具有行为。

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

DTO类用于序列化来自不同源/反序列化的数据。当你想从源反序列化对象,什么并不重要外部来源是:服务,文件,数据库等,你可能只需要使用的一些部分,但你想要一个简单的方法来反序列化数据到宾语。之后,你将数据复制到XModel要使用。序列化器是一个美丽的技术来加载DTO对象。为什么?你只需要一个函数来加载(反序列化)的对象。

长话短说:

DTO 描述了状态传输的模式。POCO 不描述任何东西。这是 OOP 中“对象”的另一种表达方式。它来自 POJO(Java),由 Martin Fowler 创造,他从字面上将其描述为“对象”的一个更奇特的名称,因为“对象”不是很性感。

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

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

下面是一些要比较的不同类型对象模式的示例:

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

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

POCO 不描述模式。它只是 OOP 中引用类/对象的不同方式。将其视为一个抽象概念;他们可以指任何事物。在我看来,这是一种单向关系,因为一旦一个对象达到只能完全服务一个目的的地步,它就不再是 POCO。例如,一旦您用装饰标记您的类以使其与某些框架一起工作,它就不再是 POCO。所以:

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

区分两者的要点是保持模式清晰和一致,以免交叉关注点并导致紧密耦合。例如,如果您有一个业务对象,它具有改变状态的方法,但也使用 EF 装饰来保存到 SQL Server 和 JsonProperty,以便可以通过 API 端点发送回。该对象无法容忍更改,并且可能会散布各种属性的变体(例如UserId、UserPk、UserKey、UserGuid,其中一些标记为不保存到数据库,另一些标记为不在 API 端点序列化为 JSON)。

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

甚至不给他们打电话的DTO。他们被称为模式 ....期。模型永远不会有问题。我不知道是谁用这种愚蠢的长期DTO上来,但它必须是一个.NET的事情是我自己看着办。想想MVC视图模型,同样坝**的事情,模型被用来之间的层服务器端或通过电线传输期间的状态,他们是所有车型。数据属性。这些都是你通过奥雅纳的导线型号。模型,模型模型。而已。

我希望愚蠢的长期DTO将从我们的词汇去了。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top