1. 前端传入的对象是 DTO 吗?
是的,前端通常传入的是 DTO (数据传输对象)。
- DTO(Data Transfer Object) 是一种设计模式,用于在不同层之间传递数据。它通常包含简单的属性,没有复杂的业务逻辑。
- 在 Web API 中,DTO 是用于接收和返回数据的对象,通常是前端和后端通信的桥梁。
- DTO 的设计可以与领域对象不同,通常是为了适配前端的需求(例如,字段名、结构可能与领域对象不完全一致)。
示例:DTO
public class CreateOrderDTO { private Long customerId; private List<OrderItemDTO> items; // Getters and setters... }
在这个例子中,前端会传递 CreateOrderDTO
,后端 API 接收该对象并将其转换为领域层对象。
2. 领域层的对象是 POCOs 吗?
是的,领域层的对象通常是 POCOs(Plain Old CLR Objects,或 POJOs 在 Java 中)。
- 领域层的对象是领域模型,通常是 实体(Entity)、值对象(Value Object) 和 聚合根(Aggregate Root)。
- 它们是纯粹的业务逻辑对象,不依赖于特定的框架或技术(如数据库框架、Web 框架)。这使得领域模型更加独立和易于测试。
- 领域对象可能包含复杂的业务逻辑,而不是简单的数据。
示例:POCO(领域层对象)
public class Order { private Long orderId; private List<OrderItem> items; private OrderStatus status; public void addItem(OrderItem item) { items.add(item); } public void markAsPaid() { if (status == OrderStatus.UNPAID) { status = OrderStatus.PAID; } else { throw new IllegalStateException("Order cannot be marked as paid."); } } }
Order
是领域层的对象,它包含业务逻辑,例如添加订单项和更新订单状态。
3. 数据层的对象是 DBO 吗?
是的,数据层的对象通常是 DBO(Database Object)。
- DBO 是直接与数据库表对应的对象,通常用于持久化存储(例如 ORM 实体、数据库表映射对象)。
- DBO 的设计通常与数据库结构紧密结合,因此它可能包含数据库特定的字段(例如主键、外键、时间戳等)。
- DBO 通常不包含复杂的业务逻辑,它的职责是将数据存储到数据库或从数据库读取数据。
示例:DBO(数据层对象)
@Entity @Table(name = "orders") public class OrderDBO { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(name = "customer_id") private Long customerId; @Column(name = "status") private String status; // Getters and setters... }
OrderDBO
是直接映射到数据库表 orders
的对象,用于持久化数据。
对象之间的转换
在微服务架构中,数据通常会经历以下流程:
- 前端传入的 DTO 被应用层接收。
- 应用层将 DTO 转换为 领域层的对象(POCOs),并调用领域逻辑。
- 领域层的对象在需要持久化时,转换为 数据层的对象(DBOs),通过仓储(Repository)保存到数据库。
数据流示例:
// 前端传入 DTO CreateOrderDTO createOrderDTO = new CreateOrderDTO(); createOrderDTO.setCustomerId(123L); createOrderDTO.setItems(orderItemsDTOList); // 应用层将 DTO 转换为领域对象 Order order = new Order(createOrderDTO.getCustomerId()); for (OrderItemDTO itemDTO : createOrderDTO.getItems()) { OrderItem item = new OrderItem(itemDTO.getProductId(), itemDTO.getQuantity()); order.addItem(item); } // 领域层处理业务逻辑 order.markAsPaid(); // 应用层将领域对象转换为 DBO 并保存到数据库 OrderDBO orderDBO = new OrderDBO(); orderDBO.setCustomerId(order.getCustomerId()); orderDBO.setStatus(order.getStatus().toString()); orderRepository.save(orderDBO);
总结
- 前端传入的对象是 DTO:用于传递数据,无业务逻辑。
- 领域层的对象是 POCOs:纯业务逻辑对象,无技术依赖。
- 数据层的对象是 DBO:直接映射数据库表的对象,用于持久化存储。
这种设计方式符合微服务和 DDD 的架构理念,确保各层的职责清晰分离,同时支持更好的扩展性和维护性。