向客户端发送数据的最佳实践是啥:POCO 还是 DTO?

Posted

技术标签:

【中文标题】向客户端发送数据的最佳实践是啥:POCO 还是 DTO?【英文标题】:What is the best practice for sending data to the client: POCO or DTO?向客户端发送数据的最佳实践是什么:POCO 还是 DTO? 【发布时间】:2011-04-16 07:44:59 【问题描述】:

我正在使用 EF 4 和 POCO 开始一个项目。

向客户端发送数据的最佳做法是什么?我应该发送 POCO 还是应该使用 DTO?

在将实体(与上下文断开连接)发送到客户端时,我应该注意什么问题?

是否推荐将 POCO 发送到客户端层?

【问题讨论】:

那么自我跟踪实体呢?它们可以为您节省大量用于服务器端插入、更新和删除操作的额外工作。不要相信 poco 有这个功能。我建议您阅读 Julie Lerman 的“Programming Entity Framework”。她探索了各种选项,包括:poco、dto 和自我跟踪实体。 【参考方案1】:

我相信我们在这里混合了两个相互没有关系的定义。

DTO 或数据传输对象是一种设计模式,您可以使用它在层之间传输数据,而且它们没有行为。 Martin Fowler 很好地解释了这一点:http://www.martinfowler.com/eaaCatalog/dataTransferObject.html

另一方面,我们有 POCO 或普通旧 CLR 对象。但是要说POCO,我们得知道它是从哪里开始的,也就是POJO,或者Plain Old Java Object。 Martin Fowler 和两个合伙人创造了这个词,他在这里解释:http://www.martinfowler.com/bliki/POJO.html

所以 POCO 可以有行为和你想要的一切。它们与您在日常编写的常见课程相同,只是给它们起名字以便以简短易记的方式称呼它们。

在回答您的第二个问题时,我认为最好的方法也是我一直采用的方法是将 DTO 从业务层发送到使用它的所有事物(例如:您的服务、网站、桌面应用程序、移动应用程序等.)。这是因为在大多数情况下,它们没有行为并且不仅仅是属性,因此它们是轻量级的,非常适合在服务中使用,当然,它们不会泄露来自您的业务的敏感数据。

话虽如此,如果您打算使用 DTO,我可以建议您下载 EntitiesToDTOs,这是我最近在 CodePlex 上发布的一个实体框架 DTO 生成器,它是免费和开源的。转至http://entitiestodtos.codeplex.com

【讨论】:

【参考方案2】:

我和上面的观点有点不同。 我相信服务器层外部仍然需要 DTO 或 ViewModel。 在实际应用中,有几个视图层只需要一个域对象,也就是说,几乎每个视图都需要多个域对象。 所有这些领域对象都包装在一个 DTO 或 ViewModel 类中。 这就是为什么我坚持仍然需要 DTO 或 ViewModel,即使它们是 POCO。

【讨论】:

【参考方案3】:

我会考虑将 EF4 实体业务模型和视图模型合二为一。例如,他们已经实现了开箱即用的 PropertyChanged。如果需要,部分类可以提供自定义功能。在我看来,用你自己的安全层镜像实体会产生不必要的工作和维护。

我坚信业务逻辑与其他一切的分离。但是,在 EF4 的情况下,工作已经为您完成。发疯吧。

【讨论】:

我选择不使用 EF 实体,但 POCO 因为 EF 对 PI 有很好的支持。不过谢谢你的回答。【参考方案4】:

对我而言,将 EF4 与 POCO 结合使用的主要原因之一是您不需要 DTO。我可以理解将 DTO 与传统 EDMX 文件一起使用,您的实体非常臃肿,但事实并非如此。

您的 POCO 显然需要可序列化,但确实不应该有任何特定于发送 DTO 不会发生的 POCO 实体的问题。

【讨论】:

所以向客户公开商业模式不是一个坏习惯吗?对于某些人来说,将商业模式暴露给外部世界是一种不好的做法……您对此有何看法? 对我来说,POCO 应该非常......好吧......可以这么说。如果是这样,将其发送给客户有什么害处?你的 DTO 会是什么样子?他们会几乎完全反映 POCO 吗?那为什么还要让自己头疼呢?当你想消除很多垃圾时,DTO 很不错,但如果它们不包含你不想暴露的敏感信息,我真的不认为将你的 POCO 发送到世界有什么害处。 这篇文章怎么样:***.com/questions/3760244/… 那篇文章是专门针对 WCF 的。这个想法是通过将 POCO 实体与 WCF 数据合同分开来获得灵活性。我不能说我不同意,但我没有在您的原始帖子中看到任何提及 WCF 的内容。在使用 WCF 服务时,我经常使用“视图模型”作为 EF 实体之上的数据协定对象。 我明白了。所以在 WCF 场景中,最好不要将 POCO 暴露给客户端。

以上是关于向客户端发送数据的最佳实践是啥:POCO 还是 DTO?的主要内容,如果未能解决你的问题,请参考以下文章

GWT 将大量数据从服务器发送到客户端的最佳实践

在 JSON 中传递美元金额的最佳实践是啥?

最佳实践:代表用户发送电子邮件

连接/断开数据库的最佳实践是啥?

连接/断开数据库的最佳实践是啥?

一次向所有用户的设备发送消息的最佳方式是啥?