在 DDD 中为外部服务准备复杂的请求负载

Preparing complex request payload for external service in DDD

我是域驱动设计的新手,很难理解一件事我会在本文结束时提出 post。

以下是我所知道的关于 DDD 的事实。

  1. 为执行 domain/business 逻辑获取数据的外部 REST 调用应该发生在应用层。
  2. 工厂是域层的一部分,应该用于创建域对象。

现在,我正在尝试设计一个 REST 微服务。我正在设计的 POST 服务的负载,我们称之为 SearchRequest,我正在考虑将其作为我域的一部分。 SearchResponse,这是我的微服务 REST 的响应 api 又是域的一部分。

我的第一个问题是,SearchRequest & SearchResponse 应该成为我的领域模型的一部分吗?

此外,为了准备 SearchResponse,我需要进行外部 API 调用,请求负载存在于第三方 jar 中。我需要编写一个复杂的逻辑来使用来自 SearchRequest.

的数据为外部 api 准备请求负载

外部 API 的请求负载是否应该是域的一部分?如果是,那么我可以在领域层有一个工厂来准备请求有效负载。如果不是,那么我应该在哪一层有逻辑来创建它。我可以在应用层使用工厂来创建不属于域的对象吗?

My first question is, should SearchRequest & SearchResponse be a part of my domain model?

理想情况下,没有。请求和响应是 应用层 结构。应用层旨在服务域的各种用例;它不是域本身。

Should the request payload for external API be a part of the domain? If yes, then I can have a factory in the domain layer to prepare the request payload.

首先,外部 API 负载不属于您的域;它属于不同的限界上下文,用它自己的通用语言表达。在得出确切的潜在解决方案之前的一些背景知识:两个有界上下文不能自由混合,原因很明显,即同一概念在不同的有界上下文中可能具有不同的含义。两个域之间的通信必须通过 anti-corruption 层 (ACL) 进行,该层将外部有界上下文映射到您自己的上下文中,反之亦然。

正如 Vaughn Vernon 在他的书中建议的那样,ACL 可以作为 域服务 甚至 存储库 实现,两者都属于到领域层。假设您使用域服务,将必要的字段从 SearchRequest 传递到进行外部调用的域服务方法。该方法隐藏了外部服务请求构造逻辑以及到您的域对象的外部服务响应映射。域服务包含对构建外部请求所必需的对象(在您的情况下是 third-party JAR 中定义的类型)的引用,但其客户端仍然不知道外部服务的域(有界上下文)。

这里的主要规则是领域模型不能依赖于任何东西。如果它依赖于某些东西,那么你必须将它与接口或事件解耦。

我认为答案取决于这些外部 API 调用在您的领域模型中的渗透程度。

  • a.) 如果只是一个调用,那么您可以为外部 API 调用定义一个基础结构服务接口,并将基础结构服务注入域服务并从您的域调用该域服务。
  • b.) 如果您使用多个不同的调用,那么您可以拥有多个域服务和多个基础结构服务。
  • c.) 如果你变得非常复杂,那么你也可以定义存储库、实体等,甚至可以定义一个单独的有界上下文,并最终得到一个完整的反腐败层。