六边形架构/端口和适配器:适配器之间的通信

问题描述 投票:0回答:1

我读过很多关于端口和适配器的文章。考虑到通信,它们都只是谈论通过端口在不同“层”(域、应用程序、适配器)之间进行通信。

但是当我想在两个不同的适配器之间进行通信时,正确的方法是什么?例如,我想从 Elasticsearch 获取一个文档,并通过存储在 S3 中的一些值来丰富该文档?

我记得我的一位前同事说过,适配器之间直接通信(即:直接调用彼此的公共方法),而不使用端口,这是可以的。但这真的是真的吗?我在哪里可以找到更多相关信息?使用端口进行层内通信的优点/缺点是什么?

java architecture microservices hexagonal-architecture
1个回答
0
投票

TL;博士

简短的回答,不,您可能没有适配器相互通信。

这在六边形架构中并没有真正的意义。 ;)

我不会使用端口以您在域视图之外描述的方式进行通信,因为这会导致与域相关的逻辑在六轴体的侧面泄漏(如果我正确理解了您的问题)

在六边形架构中,您从对主端口的调用开始,该端口将调用所涉及的任何域类,这些类将转向辅助端口来解决域关注之外的需求(持久性、事件传播等)向前)。

话虽如此,请继续阅读原因;)

长答案

让我们回到适配器到底是什么。它是一个端口的实现;端口是六边形中定义的接口,并且定义:

  • 对于主端口或驱动端口,域可以做什么,向外界公开什么服务
  • 对于辅助端口或驱动端口,域必须存在哪些服务才能完成其工作

端口用域术语表达所有这些,即使用属于域的类、dto、对象

端口应根据领域/业务需求进行定制;他们不应该关心所涉及的底层技术(强调复数)(这就是六边形架构的初衷)

因此,在您的特定用例中,对我来说,拥有一个定义如何加载域对象的端口更有意义,并且它是在同一适配器中使用 ES 和 S3 实现检索和映射的适配器。

如果您需要在 ES 或 S3 部分上互用一些代码,您应该在将注入到所述适配器中的特定组件(可以说是“存储库”)中执行此操作:)

六边形架构中没有任何地方规定适配器必须与特定技术绑定;如果是这样,则意味着您的端口与特定技术相关联,这反过来又违背了该架构的目的。

您可能会将驱动侧的端口/适配器视为服务于域/六边形需求的特定系统前面的一种外观。

因此,它从域中抽象出解决所涉及问题的系统细节(这里,您的域对象保存在两个不同的存储系统中)

至于研究,我主要阅读Alistair Cockburn:)

剩下的就是该架构的大量应用知识;p

希望有帮助,如果我的答案中有任何内容需要更精确,请告诉我;)

© www.soinside.com 2019 - 2024. All rights reserved.