六角结构/端口和适配器

介绍

这种架构原理是由[1] Alistair Cockburn于2005年提出的。这是DDD(域驱动设计架构)的多种形式之一。 目的是找到一种方法来解决或减轻由面向对象编程引入的一般警告。 这也称为端口和适配器体系结构。 六边形的概念与六面结构无关,也与几何形状无关。 六边形确实有六个边,但其目的是说明许多端口的概念。 此形状也更容易分为两部分,并可以用作应用程序业务逻辑的表示。 想法是将我们要开发的应用程序分为三个部分。 左,核心和右。 进入一个更广泛的概念,我们想区分内部和外部的概念。 内部是业务逻辑,应用程序本身和外部是我们用来连接应用程序并与之交互的内容。

核心

应用程序的核心可以定义为应用程序的业务逻辑发生的地方。 应用程序核心接收数据,对其执行操作,并可以选择与其他外部方(如数据库或持久性实体)进行通信。

港口

端口代表应用程序的边界。 通常,它们被实现为供外部各方使用的接口。 尽管它们共享同一域,但它们的实现位于应用程序外部。

主要端口

主端口也称为驱动端口。 这些是外部与应用程序核心之间的第一个通信点。 因此,它们仍然可以称为入站端口。 这些端口“驱动”应用程序。 这意味着这是请求到达应用程序的地方。 在这种情况下,上游包含数据,而下游包含对该请求的响应。 主端口位于六角形的左侧。

次要端口

相反,辅助端口称为从动端口。 它们也位于外部,并且与位于六角形右侧的主端口对称。 应用程序核心使用辅助端口将数据上游上传到外部实体。 例如,需要数据库中数据的操作将使用辅助端口。 应用程序“驱动”端口以获取数据。 因此,下游包含来自右侧外部实体的数据。 由于应用程序将数据发送到外部,因此辅助端口也称为出站端口。

转接器

适配器本质上是端口的实现。 它们不应在代码的任何地方直接调用

主适配器

主适配器是主端口的实现。 这些完全独立于应用程序核心。 这代表了该体系结构的更明显优势之一。 通过在外部实现端口,我们可以控制实现方式。 这意味着我们可以自由地实现将数据传递到应用程序的不同形式,而不会影响应用程序本身。 就像端口一样,主适配器也可以称为驱动适配器。 REST服务和GUI就是这样的例子。

辅助适配器

辅助适配器是辅助端口的实现。 与主适配器一样,它们也独立于应用程序核心,具有相同的明显优势。 在更多情况下,我们发现在次端口中存在有关技术选择的更困难的问题。 通常,总是存在一个关于我们实际上如何实现持久层的问题。 选择正确的数据库,文件系统或任何其他内容可能很困难。 通过使用适配器,我们可以根据需要轻松地互换适配器。 这意味着无论实现如何,我们的应用程序也不会更改。 它只会知道它需要调用的操作,而不会知道它们是如何实现的。 与主适配器相同,辅助适配器也称为从动适配器。

实作

该应用程序管理歌词的存储系统。 它存储相关的艺术家和歌词文本。 然后,我们可以访问将随机显示特定歌词和相关艺术家的端点。 我们还可以执行所有其他POST,PUT,DELETE和GET操作,以通过JPA(Java Persistence API)存储库执行CRUD(创建,读取,更新,删除)操作。 我故意通过通用操作使此应用程序简单。 理解核心,域和基础结构等概念非常重要,这也是我使用所有这些操作创建此应用程序的原因。

替代文字

结构体

在前面的几点中,我提到了一些对于设置我们的应用程序很重要的关键字。 由于这是一个演示应用程序,因此一些注意事项很重要。 我希望应用程序简单,但也要代表大多数应用程序在其核心功能。 大多数应用程序都有一个持久性框架,一个业务模型和一个表示层。 在此示例中,我选择了Spring以使用MVC(模型视图控制器)模式。 如果您想了解有关MVC [2]模式的更多信息,请单击参考部分中的以下链接。 要运行该应用程序,我们将使用Spring Boot。 为了访问我们的数据库,我使用了JPA存储库,最后我选择了内存数据库中的H2。 您还将看到我正在使用JUnit Jupiter [3],Mockito [4]和AssertJ [5]。 这些不在本教程的讨论范围之内,但是,如果您有兴趣了解有关这些框架的更多信息,请遵循以下参考部分中的链接。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns= "http://maven.apache.org/POM/4.0.0" xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation= "http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" >
    <modelVersion> 4.0.0 </modelVersion>
    <packaging> pom </packaging>
    <modules>
        <module> favourite-lyrics-domain </module>
        <module> favourite-lyrics-core </module>
        <module> favourite-lyrics-jpa </module>
        <module> favourite-lyrics-starter </module>
        <module> favourite-lyrics-test </module>
        <module> favourite-lyrics-rest </module>
    </modules>
    <parent>
        <groupId> org.springframework.boot </groupId>
        <artifactId> spring-boot-starter-parent </artifactId>
        <version> 2.2.2.RELEASE </version>
        <relativePath/>
    </parent>
    <groupId> org.jesperancinha.lyrics </groupId>
    <artifactId> favourite-lyrics </artifactId>
    <version> 0.0.1-SNAPSHOT </version>
    <name> favourite-lyrics </name>
    <description> Favourite Lyrics App </description>

    <properties>
        <java.version> 13 </java.version>
        <h2.version> 1.4.200 </h2.version>
        <lombok.version> 1.18.10 </lombok.version>
        <spring-tx.version> 5.2.2.RELEASE </spring-tx.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId> org.jesperancinha.lyrics </groupId>
                <artifactId> favourite-lyrics-domain </artifactId>
                <version> ${project.version} </version>
            </dependency>
            <dependency>
                <groupId> org.jesperancinha.lyrics </groupId>
                <artifactId> favourite-lyrics-core </artifactId>
                <version> ${project.version} </version>
            </dependency>
            <dependency>
                <groupId> org.jesperancinha.lyrics </groupId>
                <artifactId> favourite-lyrics-rest </artifactId>
                <version> ${project.version} </version>
            </dependency>
            <dependency>
                <groupId> org.jesperancinha.lyrics </groupId>
                <artifactId> favourite-lyrics-jpa </artifactId>
                <version> ${project.version} </version>
            </dependency>
            <dependency>
                <groupId> com.h2database </groupId>
                <artifactId> h2 </artifactId>
                <version> ${h2.version} </version>
                <scope> runtime </scope>
            </dependency>
            <dependency>
                <groupId> org.springframework </groupId>
                <artifactId> spring-tx </artifactId>
                <version> ${spring-tx.version} </version>
            </dependency>
            <dependency>
                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值