六角形建筑原义 - AlistairCockburn


我在http://alistair.cockburn.us/index.php/Hexagonal_architecture上发了一篇完整的文章。
最后,经过多年,我更好地理解了这个架构的含义,并转而称之为PortsAndAdaptersArchitecture,因为六边形的每个方面代表一个端口(一个独立于技术的协议,捕获讨论的理由),以及外层是GoF风格的适配器,将该协议映射到不同的外部技术。我想下一步是更好地定义什么构成'端口'。- AlistairCockburn

这是我对分层架构的标准讨论的回应。正是FourLayerArchitecture中的一行引发了这一写作,即“基础设施层。这是表示与应用程序外部实体(特别是对象世界之外的实体)的连接的对象所在的位置。”

我将标准分层模型视为更通用且更适用的模型的特例。通过“标准分层模型”我的意思是:UI - >应用程序 - >领域 - >网络和数据库。

对我来说,网络和数据库与坐在屏幕上工作的人相比没有什么不同。
事实上,我故意希望没有什么区别。我特别希望用一个装满测试用例的平面文件替换坐在屏幕上的人,用一个EDI链接到另一家公司的计算机,开发人员在表单窗口打印文档,其中带有到另一个本地程序的热链接。此外,我希望用本地的固定脚本或演示数据库替换网络和数据库,使用GUI和开发人员通过特定的链接即时发送数据。

我内心是对称主义者。我希望在某个时刻一切都是对称的,并从那里解决差异。所以我创建了一个分层模型的对称版本,其中UI不是在前面,而DB是在后面(这不是对称,这是线形流),两者都应该在外面。现在分层架构看起来像这样:

> OUTSIDE < - > transformer < - >(application < - > domain)

我把它画成同心六边形。我把这个人放在左上方,网络/ DB放在右上方,一个打印机外面有一个打印机,一个卫星,以及我能想到的任何其他东西。外六角形内部是较小的六边形。两者之间是变压器层中的变压器对象。内部六边形内部是应用程序对象和域对象,有些人喜欢分层,有些人喜欢不分层。

应用程序的工作方式如下:事件来自外部世界。transformer变换器将其转换为可用的过程调用或消息,并将其传递给应用程序。该应用程序对输入设备的性质一无所知(另请参阅Ward的CHECKS模式语言,http://c2.com/ppr/checks.html)。这样做,最终可以获得应用程序的回归测试。在“后端”(六边形没有后端),网络层实际上是另一个转换为特定输出形式的变换器transformer层,即您正在使用的特定网络和数据库。当应用程序有东西向坐在屏幕上的人报告时,它会向变换器传递一个语义上有意义的消息,变换器将其转换为合适的输出形式。该应用程序与变换器在其各个方面进行语义上的声音交互,而实际上并不知道Actor角色的本质。

六边形的每个面都代表了应用程序试图与外界交谈的一些“原因”。这就是为什么它是同心六边形而不是同心圆。在我绘制它时,左上角的输入控件,右侧的存储和辅助输入。在一些更详细的架构正式演绎中,我可能称之为端口。

我经常需要使用固定的数据片段开始新的一天,而不是指向实时数据库的链接。在基本的电子设计中,他们将其称为“ LoopBack ”(我错误地将其称为ShuntPattern很长一段时间) - 从外部端口进入内部端口的一根导线,因此机器与自身对话而不是另一端机器。这种分流将整个通信系统放在开发人员的桌面上,他可以在那里处理它。

重点是,有东西进入并且有东西出来了,我们经常需要将不同的技术插入到内部和外部。如果我可以将数据库输出重定向到我自己坐在屏幕上并输入我自己的数据,如果我可以将自己的答案放入文件中并且该文件对应用程序起到快速打字员的作用,那么在开发时我会是一个更快乐的露营者,测试和部署。

你们中的一些人也可能认为这是UserInterfaceOutside模式的扩展,这一原则最初出现在我的PLOP论文“软件架构中的优先级”(PLOP2书)和后来的CACM论文“社会问题和软件架构”中。- AlistairCockburn

(banq注:六边形架构核心是对称,同心圆,万众向心,UI界面和Oracle数据库都属于同心圆外边,不是圆心,业务逻辑才是圆心,可以更换不同的UI和不同数据库进行测试,目前Spring Boot的REST属于UI的适配器,也是与外部集成的适配器;JDBC是与具体数据库的适配器,消息系统也是一种适配器)