我读过很多关于端口和适配器的文章。考虑到通信,它们都只是谈论通过端口在不同“层”(域、应用程序、适配器)之间进行通信。
但是当我想在两个不同的适配器之间进行通信时,正确的方法是什么?例如,我想从 Elasticsearch 获取一个文档,并通过存储在 S3 中的一些值来丰富该文档?
我记得我的一位前同事说过,适配器之间直接通信(即:直接调用彼此的公共方法),而不使用端口,这是可以的。但这真的是真的吗?我在哪里可以找到更多相关信息?使用端口进行层内通信的优点/缺点是什么?
TL;博士
简短的回答,不,您可能没有适配器相互通信。
这在六边形架构中并没有真正的意义。 ;)
我不会使用端口以您在域视图之外描述的方式进行通信,因为这会导致与域相关的逻辑在六轴体的侧面泄漏(如果我正确理解了您的问题)
在六边形架构中,您从对主端口的调用开始,该端口将调用所涉及的任何域类,这些类将转向辅助端口来解决域关注之外的需求(持久性、事件传播等)向前)。
话虽如此,请继续阅读原因;)
长答案
让我们回到适配器到底是什么。它是一个端口的实现;端口是六边形中定义的接口,并且定义:
端口用域术语表达所有这些,即使用属于域的类、dto、对象
端口应根据领域/业务需求进行定制;他们不应该关心所涉及的底层技术(强调复数)(这就是六边形架构的初衷)
因此,在您的特定用例中,对我来说,拥有一个定义如何加载域对象的端口更有意义,并且它是在同一适配器中使用 ES 和 S3 实现检索和映射的适配器。
如果您需要在 ES 或 S3 部分上互用一些代码,您应该在将注入到所述适配器中的特定组件(可以说是“存储库”)中执行此操作:)
六边形架构中没有任何地方规定适配器必须与特定技术绑定;如果是这样,则意味着您的端口与特定技术相关联,这反过来又违背了该架构的目的。
您可能会将驱动侧的端口/适配器视为服务于域/六边形需求的特定系统前面的一种外观。
因此,它从域中抽象出解决所涉及问题的系统细节(这里,您的域对象保存在两个不同的存储系统中)
至于研究,我主要阅读Alistair Cockburn:)
剩下的就是该架构的大量应用知识;p
希望有帮助,如果我的答案中有任何内容需要更精确,请告诉我;)