一个 WCF 服务应该返回 EntityObject 还是 POCO/DTO 类?

7
我一直在查看许多使用EntityFramework的WCF示例,大部分似乎会向客户端返回某种POCO或DTO类。
我想知道为什么这样做,因为默认的EntityObject包含[DataContract]属性并实现INotifyPropertyChanged。返回DTO或POCO类是否比返回EntityObject更好(反之亦然)?是否有特定情况需要使用其中一个返回值而不是另一个?

1
可能是WCF,Entity Framework和Data Contracts的重复问题。 - John Saunders
2个回答

8
作为最佳实践,您应该明确设计一个数据合同并且没有持久性逻辑的DTO/POCO类来返回它。
原因是,如果您传递一个EntityObject,那么您假设服务的使用者将有对相同数据上下文的引用,这违反了显式边界的SOA准则。它降低了您的服务的可重用性。
很可能微软在EntityObject上实现了DataContract以支持一些基于WCF的数据库访问工具,例如RIA。INotifyPropertyChanged是为了WPF绑定支持而存在,与WCF或数据合同无关。

谢谢。在客户端将DTO转换回EntityObject是常见的做法,还是更倾向于为客户端的目的创建一个新模型? - Rachel
显然,这取决于你的架构,但如果客户端有数据库的本地副本,你可以将DTO转换回EntityObject。关键是保持契约的清晰,使服务不涉及任何特定的实现,它只以纯净的格式提供数据。 - Guy Starbuck
客户端应该只使用DTOs,这是由其消费的服务提供的类型,当然更简单。除非您有理由在客户端上使用所有实体功能的上下文(我怀疑,因为它是一个客户端,对吧?)。 - kzfabi
1
顺便说一句:我建议使用EntitiesToDTOs从你的Entity Framework EDMX文件自动生成DTO和Assembler。保持DRY! - kzfabi

0

在某些情况下,将POCO返回是值得的,尤其是当您不了解持久化逻辑时。我的意思是,同一个POCO可以插入到其他ORM或其他目的中。好吧,这就是POCO优于ORM的优点,但它也比添加代理/通知程序运行时的EntityObject提供了性能提升。

返回POCO - 当从WCF接收实体时,您必须手动更新实体的状态。

返回EntityObject - 您将获得维护状态的实体。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接