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

时间:2010-09-23 14:36:26

标签: c# .net entity-framework-4 poco dto

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

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

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

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

4 个答案:

答案 0 :(得分:21)

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

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层发送到使用它的所有内容(例如:您的服务,网站,桌面应用,移动应用等) )。这是因为它们没有行为,并且在大多数情况下不仅仅是属性,因此它们重量轻,理想情况下用于服务,当然,它们不会泄露您企业的敏感数据。

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

答案 1 :(得分:13)

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

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