如上所述,我正在实现一个多层架构,以便与WCF和Entity Framework 4(使用poco)协同工作。既然我已经对POCO持续无知了,我确实需要实现DTO,或者我可以以纯粹的方式使用WCF吗?
主要引用是 - 我确实需要DTO在网络上传递轻量级对象,或者我可以使用我的POCO实体。
你们推荐什么?
答案 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基础结构。如果代理类是干净的,那么你应该全部设置。