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

时间:2018-02-26 13:33:37

标签: 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;
    }

}

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

2 个答案:

答案 0 :(得分:2)

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

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

域API由应用程序指定。此API必须与适配器使用的技术无关。因此,您可以说javax.persistence不属于应用程序内的域API。

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

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

答案 1 :(得分:0)

  

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

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

  

这个用户实体实际上是域层,不包含它   依赖于java持久性库?

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

  

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

根据DDD(域驱动设计),域层不实现用例。应用层确实如此。应用程序层调用域层以执行此操作。但是这些层,DDD等概念与端口和适配器架构无关。该模式对此一无所知。

  

我真的很困惑,实际上应该是Domain Layer   在这种类型的架构中。

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