六边形架构中的的端口和适配器

  • 端口:port,在doamin中(依赖翻转,domain想要获取一个数据,只提供接口)
  • 适配器:Adapter: 在基础设施层中 具体策略实现,impl 上面的port。去实现接口,支持什么mysql,PG,redis这些了

1️⃣ 核心思想回顾

  • Domain + Application Service = 核心业务逻辑,不依赖具体技术(数据库、HTTP、消息队列等)
  • Ports = 核心业务对外提供或依赖的接口
  • Adapters = 技术实现端口,比如 MyBatis、Kafka、HttpClient 等
注意:Domain 本身没有多了东西,只是通过 Port 来访问外部资源,而不是直接依赖技术实现。

2️⃣ 简单案例:工单创建 & 获取默认 BOM

场景

  • 核心业务:创建工单时,如果没有指定 BOM,自动获取产品默认 BOM
  • 技术实现:BOM 数据存在数据库中

① 定义 Port(接口)

// Port:Domain / Application 用接口访问外部系统
public interface ProductBOMPort {
    Long getDefaultBOMId(Long productId);
}
  • 作用:核心业务只依赖接口,不依赖具体实现

② 聚合 / 应用服务(Domain + Application)

public class WorkOrderApplicationService {

    private final ProductBOMPort productBOMPort;
    private final WorkOrderRepository workOrderRepository;

    public WorkOrderApplicationService(ProductBOMPort productBOMPort,
                                       WorkOrderRepository workOrderRepository) {
        this.productBOMPort = productBOMPort;
        this.workOrderRepository = workOrderRepository;
    }

    public void createWorkOrder(CreateWorkOrderCommand command) {
        long bomId = command.bomId != null
                     ? command.bomId
                     : productBOMPort.getDefaultBOMId(command.productId); // 调用 Port

        WorkOrder workOrder = WorkOrder.create(
            command.workOrderCode,
            command.productId,
            command.plannedQuantity,
            command.routeId,
            command.productionLineId,
            bomId
        );

        workOrderRepository.save(workOrder);
    }
}
  • Domain + Application Service 不直接查数据库,只调用 Port

③ Adapter(技术实现)

// Adapter:具体实现接口,放在基础设施层
public class ProductBOMRepositoryAdapter implements ProductBOMPort {

    private final JdbcTemplate jdbcTemplate;

    @Override
    public Long getDefaultBOMId(Long productId) {
        return jdbcTemplate.queryForObject(
            "SELECT id FROM bom WHERE product_id = ? AND is_default = 1",
            Long.class,
            productId
        );
    }
}
  • 核心业务不关心 JDBC/SQL 实现,只依赖接口

3️⃣ 总结

角色

职责

Domain / Application Service

核心业务逻辑(工单创建规则)

Port

核心业务访问外部系统的接口(获取默认 BOM)

Adapter

具体实现 Port 的技术细节(JDBC/HTTP/消息队列)

✅ 核心特点:

  • Domain 没有多东西,只是依赖 接口(Port) 而不是具体技术
  • 技术变化不会影响 Domain
  • 六边形架构强调 依赖反转 + 技术解耦
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐