端口和适配器架构中的域模型实际上是什么?

mka*_*mka 5 architecture design-patterns hexagonal-architecture

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

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;
    }

}
Run Code Online (Sandbox Code Playgroud)

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

jac*_*646 4

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

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

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

所讨论的代码示例就是您可能所说的域实现。它包括应用程序不知道(并且必须保持)不知道的“插件”技术。

因此,您可以将 POJO 放入应用程序中(没有持久性注释),上面的代码将驻留在例如关系数据库适配器中,该适配器会将其域实现转换为应用程序的域 API。