我倾向于DDD,如果我的问题是天真的,那么道歉。我想我需要使用本地数据传输对象才能向用户显示数据,因为许多属性不属于任何实体/值对象。
但是,我不确定应该在域层或应用服务层中实现此DTO的位置。 DTO实现似乎是域的一部分,但这意味着当我在服务层中创建DTO集合并将其传递给表示层时,我必须在表示层中引用域层,这似乎是错误的。
使用DDD原则实现DTO的正确方法是什么?
答案 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: