如上所述,我正在实现一个多层架构以使用 WCF 和 Entity Framework 4(使用 poco)。由于我已经对 POCO 有持久性无知,我确实需要实现 DTO 或者我可以以纯粹的方式使用 WCF?
主要引用是 - 我确实需要 DTO 在网络上传递一个轻量级对象,或者我可以使用我的 POCO 实体。
大家推荐什么?
如上所述,我正在实现一个多层架构以使用 WCF 和 Entity Framework 4(使用 poco)。由于我已经对 POCO 有持久性无知,我确实需要实现 DTO 或者我可以以纯粹的方式使用 WCF?
主要引用是 - 我确实需要 DTO 在网络上传递一个轻量级对象,或者我可以使用我的 POCO 实体。
大家推荐什么?
除非您定义“纯方式”是什么,否则很难回答。我们说的是纯 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 可能值得创建。
As jfar said it depends on whether you are going to the be only one consuming the service, or whether the presentation tier is going to be you only.
If you are doing the later and it's only going to be you using your service then you can serialise you POCOs across the wcf service boundaries. This is something I have done recently and wrote this blog post about getting it to work. This will allow you to use the same entities in the app tier as well as the presentation tier.
Hope it helps.
将 WCF 与 EF 一起使用时推荐 DTO 的最有力理由是 EF 数据库优先类将实现依赖项拖到您的代理类中。如果您在 POCO 类中使用代码优先,那么应该没有实现依赖项。
尝试只返回您的 POCO 类,然后仔细查看生成的代理类。确保这些类中没有任何属于 EF 基础结构的内容。如果代理类是干净的,那么你应该已经准备好了。