3

当我最近阅读了很多关于端口和适配器架构的内容时,我偶然发现了这段代码,它是按照上述架构构建的应用程序的一部分:

package com.example.user.management;

import lombok.*;

import javax.persistence.*;
import java.io.Serializable;

@Table(name = "user")
@AllArgsConstructor
@Data
@NoArgsConstructor
@javax.persistence.Entity
@Setter
@Getter
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class User implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.TABLE)
    private Long id;

    @Column(name = "username")
    private String username;

    @Column(name = "password")
    private String password;

    @Column(name = "role")
    private String role;

    public User(String username, String password, String role) {
        this.username = username;
        this.password = password;
        this.role = role;
    }

}

由于端口和适配器架构的主要意图是将域层与任何技术细节和实现分开和隔离,并记住这个用户实体实际上是域层,它不包含对 java 的依赖持久性库?据我了解,域层仅负责实现用例。对于这种架构中的域层实际上应该是什么,我真的很困惑。

4

2 回答 2

3

很好的问题,首先注意六边形架构没有层。六边形架构有一个应用程序适配器,两者之间存在单向关系,仅此而已。没有域层。

应用程序仅使用 POJO(无导入)与其适配器进行通信。它们存在于应用程序中并由适配器共享。当适配器需要自定义(适配)这些 POJO 之一时,它会实现该对象的自己的自定义版本(例如,通过组合或继承)。这会将域拆分为您可能称之为域 API 和域实现的内容。

域 API 由应用程序指定。此 API 必须与适配器使用的技术无关。所以你说它javax.persistence不属于应用程序内部的域 API 是正确的。

有问题的代码示例就是您可能称之为域实现的内容。它包括应用程序不知道(并且必须保持)不知道的“插件”技术。

因此,您将在应用程序中放置一个 POJO(没有持久性注释),并且上面的代码将存在于例如关系数据库适配器中,它将其域实现转换为应用程序的域 API。

于 2018-02-26T15:12:26.413 回答
1

由于端口和适配器架构的主要目的是将域层与任何技术细节和实现分离和隔离

目的是将应用程序与不属于应用程序必须解决的实际问题的事物隔离开来。这些东西是输入/输出设备、数据库、技术框架等。应用程序代码必须是干净的代码。但是该模式没有说明您必须如何构造六边形的内部。您可能有或没有域层,这取决于您。

这个User实体其实就是领域层,它不包含对java持久化库的依赖吗?

假设您在应用程序内部有一个带有用户实体的域模型,那么您在此处显示的代码不是该用户实体。域模型用户实体必须与技术无关,没有注释,没有框架代码。您在此处显示的代码将属于使用 JPA 访问数据库的持久性适配器。在该适配器中,您必须在域模型的用户实体和此 JPA 用户实体之间进行转换。

据我了解,域层仅负责实现用例。

根据 DDD(领域驱动设计),领域层不实现用例。应用层可以。应用层调用领域层来做到这一点。但是这些层、DDD 等概念与端口和适配器架构无关。该模式对此一无所知。

对于这种架构中的域层实际上应该是什么,我真的很困惑。

这种架构没有说明领域层应该是什么。这个架构只是说你有一个应用程序(六边形)、端口(属于六边形的 API/SPI)和适配器(在六边形之外)。您在六边形内放置的任何层都取决于您,是域层还是其他。

于 2018-04-28T09:32:04.287 回答