8

我试图弄清楚所有这些是如何协同工作的。我知道 DTO 基本上只是域对象来回传递给表单等的数据容器。域对象是否包含 DTO 或 DTO 和域对象恰好具有将手动映射的所有相同属性?

如果我在服务中公开我的 DTO 类型,如何在不为客户端上的每个 get/set 操作创建往返的情况下使用 getter 和 setter?我知道你可以有一个很长的构造函数,但是如果你有超过 7 个属性,那会变得很丑。

在实现存储库模式时,我是传入 DTO 还是域对象?

4

2 回答 2

4
  • DTO 和域对象应该是分开的。
  • 应该有一个映射器将 DTO 映射到域对象,并将域对象映射到 DTO。这个映射器应该是一个接口的实现,默认映射器使用反射将对象相互映射。
  • 存储库应该是一个服务,它返回域对象,它们本身应该服务。
  • 如果 DTO 是由 Web 服务公开的类,则创建的 WSDL 将属性定义为元素,而在另一端创建的代理仅创建在客户端本身上运行的 getter/setter 属性,因此 getter 和 setter 不会导致往返。
  • 即使您只是在 DTO 中创建一个公共变量,代理也将作为 getter 和 setter 实现。
于 2009-02-11T06:31:31.170 回答
1

我认为最好让 DTO 包含对 Domain 对象的引用,以便 DTO 的消费者可以开始使用 Domain 对象。也就是说,如果 DTO 的使用者不能改变 Domain 对象,您可能需要让 DTO 包含封装在 Domain 对象中的值。这可能很困难,因为您可能需要对域对象进行深层复制。

我不确定为什么将 DTO 类型公开为服务会导致使用其 getter/setter 进行往返是一个问题。如果服务是远程服务,则返回的 DTO 无论如何都会被序列化,并且您的 getter/setter 将获得值的副本。如果服务不是远程的,那么执行“往返”似乎不会造成太大的损失,因为客户端和服务在同一个进程空间中。

于 2008-11-08T13:51:43.400 回答