使用带有实体框架4的WCF服务和... DTO?

时间:2010-01-05 13:03:02

标签: c# asp.net-mvc wcf dto

如上所述,我正在实现一个多层架构,以便与WCF和Entity Framework 4(使用poco)协同工作。既然我已经对POCO持续无知了,我确实需要实现DTO,或者我可以以纯粹的方式使用WCF吗?

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

你们推荐什么?

3 个答案:

答案 0 :(得分:3)

除非你定义“纯粹的方式”,否则很难回答。我们是在谈论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可能值得创建。

答案 1 :(得分:1)

正如jfar所说,这取决于你是否只是一个消费服务,或者表示层是否只是你。

如果您正在执行此操作,并且只是您正在使用您的服务,那么您可以在wcf服务边界上序列化您的POCO。这是我最近做过的事情并写了blog post关于让它发挥作用。这将允许您在应用层和表示层中使用相同的实体。

希望它有所帮助。

答案 2 :(得分:1)

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

尝试仅返回您的POCO类,但仔细查看生成的代理类。确保这些类中没有任何内容属于EF基础结构。如果代理类是干净的,那么你应该全部设置。