将 WCF 服务与实体框架 4 和...DTO 一起使用?

Posted

技术标签:

【中文标题】将 WCF 服务与实体框架 4 和...DTO 一起使用?【英文标题】:Using a WCF Service with Entity Framework 4 and...DTO? 【发布时间】:2011-01-01 15:28:52 【问题描述】:

如上所述,我正在实现一个多层架构以使用 WCF 和 Entity Framework 4(使用 poco)。由于我已经对 POCO 有持久性无知,我确实需要实现 DTO 或者我可以以纯粹的方式使用 WCF?

主要引用是 - 我确实需要 DTO 在网络上传递一个轻量级对象,或者我可以使用我的 POCO 实体。

你们推荐什么?

【问题讨论】:

DTO 和 POCO 不一样。看看this nice post。如果您最终使用 DTO,请考虑使用 EntitiesToDTOs 从您的实体框架 EDMX 文件自动生成 DTO。 【参考方案1】:

除非你定义什么是“纯粹的方式”,否则很难回答。我们说的是纯 SOA 还是纯 WCF?

WCF 代理在某种程度上已经是 DTO,因为它们不会在您的服务合同中带来任何业务逻辑。在 WCF 生成的代理类之上再创建一层 DTO 似乎是多余的。

您要回答的最大问题是“SOA 是怎样的解决方案?”。如果您想符合 SOA,则不能跨服务边界共享您的 POCO 实体。 SOA 完全是关于不同的合同。

如果您完全基于 SOA,那么您会失去很多功能,因为您的 Web 层将在大多数时间使用的类将是愚蠢的代理。您将不得不重复大量逻辑,并且丢失了 MVC 2 提供的大量“元数据,约定优于配置”功能。

如果您将 SOA 流行语扔进粉碎机,您应该这样做 (http://soafacts.com/),那么您将更轻松地跨层共享业务逻辑和元数据信息。如果您的 Web 服务的唯一消费者是您自己,那么此方法可能是您的最佳选择。

您可以在这里使用 DTO 而不是您的 POCO 实体通过网络发送。唯一的缺点是,重复的逻辑和大量的样板仪式代码什么都不做。真的取决于你的项目的大小。如果它很小,请忘记 DTO,但如果您有 20 名开发人员使用 200,000 个 LoC,那么 DTO 可能值得创建。

【讨论】:

【参考方案2】:

正如 jfar 所说,这取决于您是否将成为唯一使用该服务的人,或者表示层是否将仅是您。

如果您正在做后者并且它只是您使用您的服务,那么您可以跨 wcf 服务边界序列化您的 POCO。这是我最近所做的事情,并写了这个blog post 来让它工作。这将允许您在应用层和表示层中使用相同的实体。

希望对你有帮助。

【讨论】:

【参考方案3】:

在将 WCF 与 EF 结合使用时推荐 DTO 的最有力理由是 EF 数据库优先类将实现依赖项拖到代理类中。如果你在 POCO 类中使用代码优先,那么应该没有实现依赖。

尝试只返回您的 POCO 类,然后仔细查看生成的代理类。确保这些类中没有任何内容是 EF 基础结构的一部分。如果代理类是干净的,那么你应该已经准备好了。

【讨论】:

以上是关于将 WCF 服务与实体框架 4 和...DTO 一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

将 DTO 与 WCF 结合使用

我应该将 DTO 映射到客户端和服务器端的域实体/从域实体映射吗?

WCF 数据服务或实体框架

WCF 数据服务,序列化实体框架部分类的附加属性

关于将 Flex 与 WCF 和 Linq to Entities 一起使用的建议

DTO 类与结构