DDD - 应实施哪一层DTO

时间:2015-07-15 18:27:59

标签: domain-driven-design implementation layer dto

我倾向于DDD,如果我的问题是天真的,那么道歉。我想我需要使用本地数据传输对象才能向用户显示数据,因为许多属性不属于任何实体/值对象。

但是,我不确定应该在域层或应用服务层中实现此DTO的位置。 DTO实现似乎是域的一部分,但这意味着当我在服务层中创建DTO集合并将其传递给表示层时,我必须在表示层中引用域层,这似乎是错误的。

使用DDD原则实现DTO的正确方法是什么?

4 个答案:

答案 0 :(得分:13)

将其放在域服务层中。 DTO是该层的输出,如果您在那里定义它是有意义的。

不要将DTO放在域层中。域层不关心它层外的事情。

答案 1 :(得分:8)

DTO和Domain是不同的层 因此,它需要从一个映射到另一个,通常它在所谓的应用服务层中完成 看一下以下文章,深入了解DTO和分层:

答案 2 :(得分:6)

Yorro对于放置DTO的位置是正确的,但我鼓励您避免" DTO心态"。这种思维方式与DDD思维方式相冲突。

思考"我在这里需要一个DTO"正在考虑技术代表(正如plalx所说);它的抽象程度太低了。尝试更高级别的删除,并考虑您的域名,用户的任务和您的用户界面。

您是否需要向用户提供查看数据?通过返回特定YourViewInfo类的View Service将其带到UI。

您是否需要将数据发送到某个服务以执行任务?发送一个特定的TaskMessageInfo类或特定的Command类。

当你开始建模这些类的内部时,你应该开始考虑它的技术表现;那么你可以得出结论,即方便的DTO课程。

以这种方式思考可以帮助您对系统进行建模,而不会触发像

这样的问题
  

放置或属于这个东西的位置?

答案 3 :(得分:3)

此类暴露于外界的DTO成为合同的一部分。根据他们的形式,适合他们的地方是应用层或表示层。

如果DTO仅用于演示目的,那么Presentation Layer是一个不错的选择。

如果它们是API的一部分,则是用于输入还是输出,这是应用层关注的问题。应用层是将您的域模型连接到外部世界的方法。

作为一个有趣的观察,可以得出结论,表示层应该仅通过应用层访问它们。否则,我们将失去单点访问权限-我们将需要多层调用域模型。应用层公开了我们所有的用例。无论是通过来自其他服务的调用还是由表示层调用它们,都没有什么区别。

来源

我从沃恩·弗农(Vaughn Vernon)的The Red Book学到了这些概念的核心。 (我会引用它,但是我没有用。)有关应用程序层和表示层的章节是相关的。

从根本上说,我的结论来自严格遵守Eric Evans和Vaughn Vernon提出的概念,并优先考虑领域模型中的自由,因为这是 Domain-Driven Design:

  • 域模型应该易于更改。这意味着不要在外部公开域对象,因为拥有外部依赖项会使它们变得困难(不破坏事物)。
  • 应用层是外部访问点。它定义了域模型上的用例。这意味着 not 从其他地方在域模型上运行。表示层只能通过应用程序层。没有人喜欢处理许多不同的访问点!