我们有一个基于DDD的解决方案,我们希望获取某个实体的所有信息,包括其所有汇总。例如,如下所示:
哪种方法是获取订单汇总中所有信息(包括买方汇总数据)的最佳方法?
我当时以为使用API网关获取这些实体并提供DTO作为响应可能有效,但是我不知道在这种情况下这是否是最佳实践。
答案 0 :(得分:0)
因此,我们的目标是调用服务(这里是问题),该服务可以提供主要实体(例如订单)的信息及其相关实体(例如买方)的所有信息,但是订单模型与此相关通过名为BuyerId的属性。
您已经知道某些组件需要负责数据聚合。通常可以归结为决定是在下游(例如UI)还是在上游(例如服务器)进行聚合。
如果已经有API来收集买方数据和订单数据,并且下游客户手头有必要的关联ID,那么下游客户就有可能处理汇总数据的复杂性。这是否可以接受是另一个故事。
如果您想解决上游的数据聚合问题,则很可能有两种主要策略可供选择:
应用程序中的汇总
public OrderDetailsDto orderDetails(OrderId orderId) {
//Repositories could be switched to remote API calls
Order order = orderRepository.findById(orderId);
Buyer buyer = buyerRepository.findById(order.buyerId);
return dtoAssembler.orderDetailsFrom(order, buyer);
}
数据库中的聚合
public OrderDetailsDto orderDetails(OrderId orderId) {
ResultSet resultSet = orderDetailsFromDb(orderId);
return dtoAssembler.orderDetailsFrom(resultSet);
}
可能我们需要使用DTO
如您所见,两个实现都可以返回相同的DTO。使用显式DTO是解决合同和序列化问题的非常有用且流行的方法。如何将数据映射到此类DTO完全取决于您,并且有多种实施策略。