WCF/服务层/存储库层:从服务层返回 DTO?并从返回的 DTO 在 Controller 中创建 ViewModel

Posted

技术标签:

【中文标题】WCF/服务层/存储库层:从服务层返回 DTO?并从返回的 DTO 在 Controller 中创建 ViewModel【英文标题】:WCF / Service Layer / Repository Layer: Returning DTO from Service layer? And creating ViewModel in Controller from the DTO returned 【发布时间】:2011-08-21 19:27:48 【问题描述】:

我有一个 WCF 服务,在 WCF 服务后面是一个服务层 (http://martinfowler.com/eaaCatalog/serviceLayer.html) 和存储库层。

因此,客户端调用 WCF 服务层,而 WCF 服务层(充当服务层)调用存储库层。

存储库层返回代表数据库的模型(POCO)。那么我认为我需要将 POCO 转换为 DTO 以通过网络传输的服务层?还是我应该将这些保留为 POCO?

在服务层获得给定对象后,我会将其返回给客户端 (ASP.NET MVC),其控制器负责将从 WCF 服务返回的对象映射到 VIEWMODEL。

我想知道我做对了,即 WCF 服务后面的服务层和存储库层?

控制器负责从 WCF 服务返回的实际模型创建 ViewModel。

我还想知道是否真的有必要从存储库将返回的真实模型转换为准备好从 WCF 服务返回的 DTO。

【问题讨论】:

【参考方案1】:

就您的 WCF 服务而言,一切看起来都很好。您有模型,一个用于访问数据的存储库层,并且您将这些模型返回给客户端。是否应该使用 DTO 值得商榷。如果你有 POCO(不是一些依赖于 ORM 的对象),你应该没问题。尽管在某些情况下可能需要 DTO:例如圆形对象图,它可以由 ORM 很好地管理,但不能通过网络进行序列化(以可互操作的方式)。

现在到客户端部分:您使用 WCF 的事实应该是一个实现细节。因此,在您的 ASP.NET MVC 应用程序中,您将拥有一个与您在 svcutil.exeed 服务时导入的 POCO 一起使用的存储库,然后是该存储库的实现,它将执行对服务的实际调用(可能使用自动生成的 ServiceClient班级)。然后您的控制器应该使用抽象存储库并配置 DI 框架以注入实际实现。当控制器操作调用某个存储库方法时,它会得到一个 POCO,然后将其处理到映射层 (AutoMapper?) 以转换为传递给视图的特定视图模型。反之亦然:控制器操作从视图中获取视图模型作为操作参数,使用映射层将其映射回 POCO,POCO 将传递给存储库,该存储库将负责使用此模型执行所需任务(在您的情况下以及将其传递给某个远程 WCF 服务的具体实现)。

【讨论】:

以上是关于WCF/服务层/存储库层:从服务层返回 DTO?并从返回的 DTO 在 Controller 中创建 ViewModel的主要内容,如果未能解决你的问题,请参考以下文章

MVC3 应用程序/服务层/存储库层/POCO 类/EF4 - 问题!

使用 DTO 在服务层和 UI 层之间传输数据

使用Spring从控制器层调用存储库和服务

存储库和服务层之间的区别?

ASP.NET 应用程序中 WCF、DAO 和 DTO 层之间的交互

DTO 形状:扁平、复杂/嵌套或两者的混合