向客户端发送数据的最佳做法是什么:POCO或DTO?

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

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

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

是否建议将POCO发送到客户端层?

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

您的POCO显然需要是可序列化的,但实际上不应该有任何特定于发送POCO实体的问题,这些问题也不会出现在DTO中。

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

DTO或数据传输对象是一种设计模式,您可以使用它在层之间传输数据,并且它们也没有行为。 Martin Fowler对此非常熟悉: http : //www.martinfowler.com/eaaCatalog/dataTransferObject.html

另一方面,我们有POCO或Plain Old CLR Object。 但是要谈论POCO,我们必须知道它的起源,即POJO或Plain Old Java Object。 Martin Fowler与两位合伙人共同创造了这个词,他在这里解释: http : //www.martinfowler.com/bliki/POJO.html

因此,POCO可以拥有您想要的行为和一切。 它们与你每天写的相同的普通课程,他们只是给他们这个名字,以简短易记的方式称呼他们。

在第二个问题的回答中,我认为最好的方法和我经常使用的方法是将DTO从Busines Layer发送到使用它的所有内容(例如:您的服务,网站,桌面应用,移动应用等)。 这是因为它们没有行为,并且在大多数情况下不仅仅是属性,因此它们重量轻,理想情况下用于服务,当然,它们不会泄露您企业的敏感数据。

话虽这么说,如果您打算使用DTO,我可以建议您下载EntitiesToDTOs,我刚刚在CodePlex上发布的entity frameworkDTO生成器,它是免费的开源软件。 转到http://entitiestodtos.codeplex.com

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

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

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