我对领域驱动设计非常陌生,很难理解一件事,我将在这篇文章的最后问。
以下是我所知道的关于DDD的事实。
- 外部REST调用获取执行域/业务逻辑的数据应该发生在应用层。
- 工厂是域层的一部分,应该用于创建域对象。
现在,我正在尝试设计一个REST微服务。我设计的POST服务的有效载荷,我们叫它SearchRequest是我认为属于我的领域的一部分。SearchResponse,这是我的微服务的REST api的响应,也是域的一部分。
我的第一个问题是,应该SearchRequest,SearchResponse成为我的领域模型的一部分?
同时,准备SearchResponse我需要进行外部API调用,其请求有效负载存在于第三方jar中。我需要编写一个复杂的逻辑,使用来自SearchRequest的数据为外部api准备请求有效载荷.
外部API的请求有效负载应该是域的一部分吗?如果是,那么我可以在域层中有一个工厂来准备请求有效负载。如果没有,那么在哪一层我应该有逻辑来创建相同的。我可以在应用层使用工厂来创建不属于域的对象吗?
我的第一个问题是,是否应该SearchRequest &SearchResponse是我的领域模型的一部分吗?
最理想的情况是,没有。请求和响应是应用层结构。应用层服务于域的各种用例;它不是域名本身。
外部API的请求有效负载应该是域的一部分吗?如果是,那么我可以在域层中有一个工厂来准备请求有效负载。
首先,外部API负载不是你的域的一部分;它属于一个不同的边界上下文,用它自己的通用语言来表达。在讨论确切的潜在解决方案之前,先介绍一下背景知识:两个有界上下文不能随意混合,原因很明显,同一个概念在不同的有界上下文中可能具有不同的含义。两个域之间的通信必须通过反腐败层(ACL)进行,该层将外部有界上下文映射到您自己的上下文,反之亦然。
正如Vaughn Vernon在他的书中所建议的那样,ACL可以作为域服务甚至存储库来实现,两者都属于域层。假设您使用域服务,将必要的字段从SearchRequest
传递给进行外部调用的域服务方法。该方法隐藏外部服务请求构造逻辑以及到域对象的外部服务响应映射。域服务包含对构造外部请求所必需的对象(在您的示例中是在第三方JAR中定义的类型)的引用,但其客户端仍然不知道外部服务的域(有界上下文)。
这里的主要规则是,域模型不能依赖于任何东西。如果它依赖于某些东西,那么你必须将它与接口或事件解耦。
我认为答案取决于这些外部API调用在多大程度上渗透到你的领域模型中。
- 。)如果它只是一个调用,那么您可以为外部API调用定义基础设施服务接口,并将基础设施服务注入域服务,然后从域调用该域服务。
- b。)如果您使用几个不同的调用,那么您可以拥有多个域服务和多个基础设施服务。
- c。)如果你真的很复杂,那么你也可以定义存储库、实体等,甚至可以定义一个单独的有界上下文,最终得到一个完整的反腐败层。