一、概述
在本教程中,我们将使用 Hexagonal Architecture 的原理,使用 CLI 使用者实现一个简单的 Java CMS 应用程序。主要思想是尽可能保持业务逻辑分离,并使用SOLID原则中的“ D”依赖反转原则来防止层之间的耦合。
2. 什么是六边形架构
它是一种围绕业务逻辑设计软件应用程序架构并将其与其他层解耦的方法。解耦是通过使用端口和适配器来处理的,这就是为什么 Hexagonal Architecture六边形架构 也被称为Ports & Adapters的原因。
您可以看到由 Hexagonal 架构分层的典型应用程序的几个关键特征;
- 您可以定义端口来说明您可以对特定域对象做什么,这些端口应该是接口
- 有两种类型的端口;入站(或驱动) 端口和出站(或驱动)端口
- 适配器是端口的不同实现
- 有 2 种类型的适配器;入站(或驱动) 适配器和出站(或驱动)适配器
- 领域对象从不依赖于外部层。
3. 组织项目结构
该项目包含 2 个根包:
- domain 用于域对象、端口和用例,以说明域对象的契约和行为
- 基础设施主要包含输入和输出端口的适配器实现
对于每个域对象,在我们的例子中,我们有一个包来将端口和用例保存在域包中。在基础设施包中,我们为每个域对象提供了适配器包。
4.领域模型
我们的领域模型,Article 是用来说明文章信息的,相关实现如下;
<pre class="prettyprint hljs vbscript" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; overflow-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;"><b>public</b> record Article(
Long id,
Long accountId,
String title,
String body
) {}
这是一个简单的 Java POJO 类来声明文章信息,让我们看看如何在 Port 接口中编写合约
5. 端口
如果你想定义一个包含创建、检索和查询行为的端口,下面的接口将是一个不错的选择;
<pre class="prettyprint hljs xml" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; overflow-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;"><b>public</b> <b>interface</b> ArticlePort {
Arti