我正在使用EF 4和POCO开始一个项目。
发送数据给客户端的最佳实践是什么?我应该发送POCO还是应该有一个DTO?
当将与上下文断开连接的实体发送到客户端时,我应该注意哪些问题?
将POCO发送到客户端层是否是推荐实践?
我正在使用EF 4和POCO开始一个项目。
发送数据给客户端的最佳实践是什么?我应该发送POCO还是应该有一个DTO?
当将与上下文断开连接的实体发送到客户端时,我应该注意哪些问题?
将POCO发送到客户端层是否是推荐实践?
我认为我们在这里混淆了两个不相关的定义。
DTO或数据传输对象是一种设计模式,您可以使用它在层之间传输数据,并且它们没有行为。Martin Fowler在http://www.martinfowler.com/eaaCatalog/dataTransferObject.html上很好地解释了这一点。
另一方面,我们有POCO或普通旧CLR对象。但是要谈论POCO,我们必须知道它的起源,即POJO或普通旧Java对象。Martin Fowler与两位合作伙伴创造了这个术语,他在http://www.martinfowler.com/bliki/POJO.html中解释了这一点。
因此,POCO可以具有行为和任何您想要的内容。它们是您日常编写的相同普通类,只是给它们起了一个简短易记的名字。
回答您的第二个问题,我认为最好的方法是从业务层向使用它的所有内容(例如:您的服务、网站、桌面应用程序、移动应用程序等)发送DTO。这是因为它们没有行为,在大多数情况下只有属性,因此它们是轻量级的,并且非常适合在服务中使用,当然,它们不会公开您业务的敏感数据。
话虽如此,如果您计划使用DTO,我可以推荐您下载EntitiesToDTOs,这是我最近在CodePlex上发布的Entity Framework DTO生成器,它是免费且开源的。请访问http://entitiestodtos.codeplex.com
对我来说,使用EF4和POCO的主要原因之一是你不需要使用DTO。我能理解在传统的EDMX文件中使用DTO的情况,因为你的实体可能会非常臃肿,但这并不是现在的情况。
你的POCO显然需要是可序列化的,但发送POCO实体时不应该有任何特定问题,这些问题与使用DTO的情况相同。
我对以上观点持有稍微不同的意见。 我认为在服务器层之外仍然需要DTO或ViewModel。 在实际应用中,有一些视图层仅需要一个领域对象,也就是几乎每个视图都需要多个领域对象。 而所有这些领域对象都被包装在一个DTO或ViewModel类中。 这就是为什么我坚持认为即使它们是POCO,DTO或ViewModel仍然是必需的。
我认为EF4实体是业务模型和视图模型的结合体。例如,它们已经默认实现了PropertyChanged。如果需要,部分类可以提供自定义功能。在我的看法中,将实体与自己的安全层进行镜像处理会创建不必要的工作和维护。
我相信业务逻辑和其他所有内容应该分离。然而,在EF4的情况下,这项工作已经为您完成了。尽情使用吧。