2010-09-23 88 views
24

我开始使用EF 4和POCO的项目。将数据发送到客户端的最佳做法是什么:POCO或DTO?

发送数据到客户端的最佳做法是什么?我应该发送POCO还是应该有一个DTO?

有没有我应该知道发送的实体时的任何问题(即从上下文断开)到客户端?

将POCO发送到客户层是否是一种推荐的做法?

+0

那么自我跟踪实体呢?它们可以为服务器端的插入,更新和删除操作节省大量额外的工作。不要相信poco有这个功能。我建议你阅读Julie Lerman的“编程实体框架”。她探索各种选项,包括:poco's,dto's和自我跟踪实体。 – 2011-07-23 16:41:56

回答

12

对我来说,使用EF4与POCO的主要原因之一是你不需要需要 DTO's。我可以理解使用DTO的传统EDMX文件,你的实体非常臃肿,但事实并非如此。

你的POCO显然需要序列化,但确实不应该具体到发送不也与DTO的发生POCO实体的任何问题。

+3

因此,向客户展示商业模式并不是一个坏习惯?对于某些人来说,将商业模式暴露给外部世界是一种不好的做法......您对此有何看法? – pdiddy 2010-09-23 15:25:03

+4

对我来说,POCO应该非常......好吧......可以这么说。如果是这样的话,将其发送给客户有什么危害?你的DTO会是什么样子?他们几乎准确地反映POCO?那为什么要让自己头痛呢?如果您想消除大量的垃圾信息,DTO就很好,但如果不包含您不想暴露的敏感信息,我并不认为将POCO发送给世界会带来危害。 – 2010-09-23 15:59:29

+0

谢谢,我想我会发送POCO对象。我只是觉得这是一个不好的习惯。但就我而言,我们并没有真正把它们暴露给外部世界。我们正在接触我们自己的客户端应用程序。 – pdiddy 2010-09-23 18:48:52

0

我会考虑将EF4实体的商业模型和视图模型合并为一个。例如,它们已经实现了PropertyChanged。如果需要,部分类可以提供自定义功能。在我看来,使用自己的安全层来镜像实体会造成不必要的工作和维护。

我是分离业务逻辑和其他一切的信徒。然而,在EF4的情况下,工作已经完成了。发疯。

+0

我选择不使用EF实体,但是因为EF对PI有很好的支持,所以POCO。但谢谢你的回答。 – pdiddy 2010-09-23 18:50:01

21

我相信,我们在这里混合2组的定义没有相互关系。

DTO或数据传输对象是一种设计模式,你可以用它来层之间传输数据,还他们没有行为。 Martin Fowler的解释,在这个非常好:http://www.martinfowler.com/eaaCatalog/dataTransferObject.html

在另一方面,我们有POCO或普通老式CLR对象。但要谈论POCO,我们必须知道它开始的地方,那就是POJO,或简单的旧Java对象。 Martin Fowler的两个合作伙伴创造了这个词,他在这里解释它:http://www.martinfowler.com/bliki/POJO.html

所以波苏斯可以有你想要的行为和一切。他们是你每天写的同样的普通课程,他们只是给他们一个这个名字,用简短易记的方式给他们打电话。对于你的第二个问题,我认为最好的方法和我总是选择的方法是从业务层发送DTO到使用它的所有东西(例如:你的服务,网站,桌面应用程序,移动应用程序,等等。)。这是因为它们没有行为,并且不仅仅是大多数情况下的属性,所以它们重量轻,理想地用于服务中,当然,它们不会泄漏来自业务的敏感数据。这就是说,如果您打算使用DTO,我可以推荐您下载EntitiesToDTOs,这是我最近在CodePlex上发布的实体框架DTO生成器,它是免费且开源的。转到http://entitiestodtos.codeplex.com

1

我从上面的意见有点不同意见。 我相信DTO或ViewModel仍然是服务器层外侧需要的。 在现实世界的应用中,有几个视图层只需要一个Domain对象,即几乎每个视图都需要多个Domain对象。 并且所有这些域对象都包装在一个DTO或ViewModel类中。 这就是为什么我坚持要求即使他们是POCO仍然需要DTO或ViewModel。

相关问题