【问题标题】:How to separate domain model from REST module?如何将域模型与 REST 模块分离?
【发布时间】:2018-10-05 08:27:52
【问题描述】:

我在 DDD 中有一个多模块 Java 应用程序,其中包括带有映射器的 Web (REST) 模块,它依赖于处理业务逻辑的域模块。

从域对象到 DTO 的映射是在 web 模块中进行的,但我不希望它了解域模型中的实体和值对象。

我正在考虑引入一个新模块来创建 Web 和域之间的分离。它会接收来自 web 的调用并将它们传输到域(业务层),但是这个解决方案需要大量的映射器和新对象,在我看来这有点混淆了应用程序,因为它将有大约 50 个类。

有没有其他方法可以解决这个问题,或者它没有我想的那么严重,可以保持目前的状态。

提前谢谢你。

【问题讨论】:

  • 你的问题不是很清楚。你能分享更多细节吗?
  • 你通常会有 REST -> ApplicationLayer -> Domain/Infrastructure

标签: java module architecture domain-driven-design


【解决方案1】:

您所描述的工作是由DDD的应用层完成的,不需要添加另一个模块。应用层将域对象映射到 dto,反之亦然。

【讨论】:

  • 感谢您的回答,但我仍然有点困惑,因为我的技术负责人声称应用程序层不应该返回 dtos,他认为这是 Web 层的责任(在我的情况下持有休息控制器等) - 他错了吗?我遇到过一些帖子告诉应用层应该返回 dtos,但由于他的意见,我仍然持怀疑态度。
  • 那么我不同意他的看法。 DTO 是应用程序服务的参数/返回类型。应用程序服务从 DTO 构建域对象,反之亦然,以将域与客户端(例如控制器)分离。你也可以看看 Vaughn Vernon 的红皮书“实施 DDD”,或书籍代码示例的 github 存储库 (github.com/VaughnVernon/IDDD_Samples/tree/master)。看一下协作上下文的应用层。另一个例子:命令模式……它应用在应用层。命令处理程序是应用程序服务,命令是 DTO
  • @devoxy 无论如何我并不是说他错了,我是对的。我只是说我不同意他的观点。我认为 DTO 属于应用层,这就是我在项目中所做的。我这样做是因为在阅读了“实施 DDD”一书后,我明白了这一点。
  • @devoxy 在本书的第 14 章(应用程序)中,“用户界面”部分(第 512 页)解释了应用程序层如何在不暴露域的情况下处理向客户端提供信息的一些不同方式。其中一种选择是 DTO: - dtos - 中介 - 域有效负载对象 - 状态表示 - 用例最佳存储库查询(对 cqrs 关闭) - 数据转换器
  • 谢谢@choquero70。你的回复对我帮助很大。在阅读了过去 2 天的 stackoverflow 以找到此问题和其他问题的答案后,我认为相同。此处应使用应用层,并应与 DTO 一起使用。
猜你喜欢
  • 2010-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多