领域层 (Domain Layer)

领域层是业务逻辑的核心,负责处理与业务规则和领域对象相关的内容。它通常包含领域模型(实体、值对象、聚合根)以及领域服务。

示例:一个电子商务系统

1. 实体 (Entity)

实体是具有唯一标识的领域对象,代表业务中的核心概念。

public class Order { private Long orderId; // 唯一标识 private List<OrderItem> items; // 订单项 private OrderStatus status; // 订单状态 public void addItem(OrderItem item) { items.add(item); } public void removeItem(OrderItem item) { items.remove(item); } public void markAsPaid() { if (status == OrderStatus.UNPAID) { status = OrderStatus.PAID; } else { throw new IllegalStateException("Order cannot be marked as paid."); } } }
2. 值对象 (Value Object)

值对象没有唯一标识,用来表示某些不可变的业务概念。

public class Money { private final BigDecimal amount; private final Currency currency; public Money(BigDecimal amount, Currency currency) { this.amount = amount; this.currency = currency; } public Money add(Money other) { if (!this.currency.equals(other.currency)) { throw new IllegalArgumentException("Different currencies cannot be added."); } return new Money(this.amount.add(other.amount), this.currency); } }
3. 聚合根 (Aggregate Root)

聚合根是领域模型中的一个重要对象,它负责维护整个聚合的完整性。

public class Customer { private Long customerId; private String name; private List<Order> orders; public void placeOrder(Order order) { orders.add(order); } }
4. 领域服务 (Domain Service)

领域服务处理那些不适合直接归属于某个实体或值对象的业务逻辑。

public class PaymentService { public void processPayment(Order order, Payment payment) { if (payment.isValid() && order.getStatus() == OrderStatus.UNPAID) { order.markAsPaid(); } else { throw new IllegalStateException("Payment cannot be processed."); } } }

应用层 (Application Layer)

应用层负责协调用户请求和领域层的交互,通常包含用例逻辑和服务。它不包含复杂的业务规则,仅仅负责调用领域层的逻辑,处理流程、事务和外部系统的交互。

示例:一个电子商务系统

1. 应用服务

应用服务通常是领域逻辑的入口,处理与用户交互的用例逻辑。

public class OrderApplicationService { private final OrderRepository orderRepository; private final PaymentService paymentService; public OrderApplicationService(OrderRepository orderRepository, PaymentService paymentService) { this.orderRepository = orderRepository; this.paymentService = paymentService; } public void placeOrder(Long customerId, List<OrderItem> items) { Customer customer = customerRepository.findById(customerId); Order order = new Order(); for (OrderItem item : items) { order.addItem(item); } customer.placeOrder(order); orderRepository.save(order); } public void payForOrder(Long orderId, Payment payment) { Order order = orderRepository.findById(orderId); paymentService.processPayment(order, payment); orderRepository.save(order); } }
2. DTO (数据传输对象)

DTO通常在应用层中使用,用于与前端或其他系统交互。

public class OrderDTO { private Long orderId; private List<OrderItemDTO> items; private String status; // Getters and setters... }
3. 编排流程

应用层负责编排多个领域服务或外部系统的交互。

public class CheckoutService { private final OrderApplicationService orderApplicationService; private final InventoryService inventoryService; public CheckoutService(OrderApplicationService orderApplicationService, InventoryService inventoryService) { this.orderApplicationService = orderApplicationService; this.inventoryService = inventoryService; } public void checkout(Long customerId, List<OrderItem> items, Payment payment) { inventoryService.reserveItems(items); orderApplicationService.placeOrder(customerId, items); orderApplicationService.payForOrder(orderId, payment); } }

总结

  • 领域层:处理核心业务逻辑,如订单的状态转换、金额计算等。
  • 应用层:负责用例编排,调用领域层逻辑并处理外部系统交互。

领域层的代码更贴近业务本身,具有较强的稳定性;而应用层的代码则更贴近用户操作和系统交互,通常会随着需求的变化而调整。

posted on 2025-08-19 10:58  淡淡糖  阅读(28)  评论(0)    收藏  举报