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

标签 design-patterns architecture 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;
    }

}

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

最佳答案

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

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

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

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

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

关于design-patterns - 端口和适配器架构中的域模型实际上是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48989802/

相关文章:

mysql - 是否应该避免向更大的 MySQL 表中添加另一个字段?

architecture - 洋葱结构与六边形相比

Git + SoA,一个仓库还是多个仓库?

android - 如何在自定义 View 中重复一个模式到边界?

c++ - 静态库中的单例类

c++ - 这种设计模式的名称是什么?门面、适配器、网桥、代理?

architecture - 如何进行项目前架构审查

api - 与 dto 合作使用 DDD 构建 API

web-services - 依赖于 SOAP API 的服务设计发生了很大变化

c# - 为什么要使用工厂方法来创建对象