数据传输对象,域对象和存储库

时间:2008-11-08 07:08:49

标签: domain-driven-design

我正在试图弄清楚所有这些是如何协同工作的。我知道DTO基本上只是一个数据容器,域对象可以来回传递给表单等。 Domain对象是包含DTO还是DTO,而Domain Object恰好具有将手动映射的所有相同属性?

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

实现存储库模式时,是否要传入DTO或域对象?

2 个答案:

答案 0 :(得分:4)

  • DTO和Domain对象应该是分开的。
  • 应该有一个映射器将DTO映射到域对象,将域对象映射到DTO。此映射器应该是接口的实现,默认映射器使用反射将对象映射到彼此。
  • 存储库应该是一个返回域对象的服务,域对象本身应该提供服务。
  • 如果DTO是由Web服务公开的类,则创建的WSDL将该属性定义为元素,而在另一侧创建的代理只创建一个运行的getter / setter属性。客户本身,所以吸气剂和制定者不会导致往返。
  • 即使您只是在DTO中创建公共变量,代理也将实现为getter和setter。

答案 1 :(得分:1)

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

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