Domain driven design 数据传输对象、域对象和存储库

Domain driven design 数据传输对象、域对象和存储库,domain-driven-design,Domain Driven Design,我想弄清楚这些是怎么一起工作的。我知道DTO基本上只是一个数据容器,用于域对象来回传递到表单等。域对象是否包含DTO,或者DTO和域对象是否恰好具有将手动映射的所有相同属性 如果我在服务中公开我的DTO类型,我如何使用getter和setter而不为客户机上的每个get/set操作创建往返?我知道你可以有一个长的构造函数,但是如果你有7个以上的属性,那就很难看了 在实现存储库模式时,我是传入DTO还是传入域对象?我认为最好让DTO包含对域对象的引用,以便DTO的消费者可以开始使用域对象。也就是说

我想弄清楚这些是怎么一起工作的。我知道DTO基本上只是一个数据容器,用于域对象来回传递到表单等。域对象是否包含DTO,或者DTO和域对象是否恰好具有将手动映射的所有相同属性

如果我在服务中公开我的DTO类型,我如何使用getter和setter而不为客户机上的每个get/set操作创建往返?我知道你可以有一个长的构造函数,但是如果你有7个以上的属性,那就很难看了


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

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

我不知道为什么将DTO类型作为服务公开会导致使用它的getter/setter进行往返访问会出现问题。如果服务是远程服务,返回的DTO将被序列化,并且getter/setter将获得值的副本。如果服务不是远程的,那么执行“往返”似乎不会带来太大的损失,因为客户端和服务位于同一进程空间。

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