Java和Spring的六边形架构:在代码中体现“六角形建筑”

前言:
术语“六角形建筑”已经存在很长时间了。足够长的时间,这个主题的主要资源已经脱机了一段时间,并且直到最近才从档案中解救出来。

但是,我发现关于如何以这种体系结构样式实际实现应用程序的资源很少。本文的目的是提供一种用Java和Spring以六边形样式实现Web应用程序的自以为是的方式。

什么是“六角形建筑”?

与常见的分层体系结构样式相反,“六角形体系结构”的主要特征是组件之间的依赖关系“指向内部”,指向我们的领域对象:

Java和Spring的六边形架构:在代码中体现“六角形建筑”_第1张图片

 

六边形只是一种描述应用程序核心的奇特方法,该应用程序由领域对象,在其上操作的用例以及为外界提供接口的输入和输出端口组成。

1、域对象

在具有业务规则的域中,域对象是应用程序的命脉。域对象可以包含状态和行为,行为越接近状态,代码将越容易理解,推理和维护。

域对象没有任何外部依赖性。它们是纯Java,并提供了用于用例的API。

由于域对象不依赖于应用程序的其他层,因此其他层的更改不会影响它们。它们可以不受依赖地演变,这是“单一责任原则”(“ SOLID”中的“ S”)的主要示例,该原则指出组件应该只有一个更改的理由。对于我们的域对象,原因是业务需求的变化。

只需承担一项责任,我们就可以演化域对象,而不必考虑外部依赖关系。这种可扩展性使六角形体系结构样式非常适合在实践域驱动设计时。在开发过程中,我们只是遵循自然的依赖关系流程:我们开始在域对象中进行编码,然后从那里开始,如果不是域驱动的,那么我不知道是什么。

2、用例

我们知道用例是用户使用我们的软件所做的抽象描述。在六角形体系结构样式中,将用例提升为我们代码库的“一等公民”是有意义的。

从这个意义上讲,用例是一个处理特定用例周围所有内容的类。作为示例,让我们考虑银行应用程序中的用例“将钱从一个帐户发送到另一个帐户”。

我们将创建一个SendMoneyUseCase具有独特API 的类,该API允许用户转移资金。该代码包含特定于用例的所有业务规则验证和逻辑,因此无法在域对象中实现。其他所有内容都委托给域对象(例如,可能存在域对象Account)。

与域对象类似,用例类不依赖于外部组件。当它需要六角形之外的东西时,我们创建一个输出端口。

3、输入和输出端口

域对象和用例在六边形内,即在应用程序的核心内。每次与外部的通信都是通过专用的“端口”进行的。

输入端口是一个简单的接口,可由外部组件调用,并由用例实现。调用此类输入端口的组件称为输入适配器或“驱动”适配器。

输出端口还是一个简单的接口,如果我们的用例需要外部的东西(例如,数据库访问),则可以用它们来调用。该接口旨在满足用例的需求,但由称为输出或“驱动”适配器的外部组件实现。如果您熟悉SOLID原理,则这是依赖关系反转原理(在SOLID中为“ D”

你可能感兴趣的:(java,编程语言,spring)