29、六边形架构中的的端口和适配器
本文介绍了六边形架构的核心思想:通过端口(Port)和适配器(Adapter)实现业务逻辑与技术实现的解耦。Domain层定义Port接口(如ProductBOMPort)来声明外部依赖,业务逻辑通过接口访问外部资源而不依赖具体实现。技术实现由基础设施层的Adapter(如ProductBOMRepositoryAdapter)完成,支持多种技术方案。案例展示了工单创建时获取默认BOM的实现过程,
·
六边形架构中的的端口和适配器
- 端口: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
- 六边形架构强调 依赖反转 + 技术解耦
更多推荐
所有评论(0)