获取具有DDD中所有(或某些)相关实体的对象的最佳方法

时间:2019-01-22 14:52:43

标签: api domain-driven-design dto gateway

我们有一个基于DDD的解决方案,我们希望获取某个实体的所有信息,包括其所有汇总。例如,如下所示:

哪种方法是获取订单汇总中所有信息(包括买方汇总数据)的最佳方法?

我当时以为使用API​​网关获取这些实体并提供DTO作为响应可能有效,但是我不知道在这种情况下这是否是最佳实践。

1 个答案:

答案 0 :(得分:0)

  

因此,我们的目标是调用服务(这里是问题),该服务可以提供主要实体(例如订单)的信息及其相关实体(例如买方)的所有信息,但是订单模型与此相关通过名为BuyerId的属性。

您已经知道某些组件需要负责数据聚合。通常可以归结为决定是在下游(例如UI)还是在上游(例如服务器)进行聚合。

如果已经有API来收集买方数据和订单数据,并且下游客户手头有必要的关联ID,那么下游客户就有可能处理汇总数据的复杂性。这是否可以接受是另一个故事。

如果您想解决上游的数据聚合问题,则很可能有两种主要策略可供选择:

  1. 应用程序中的汇总

    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); 
    }
    
  2. 数据库中的聚合

    public OrderDetailsDto orderDetails(OrderId orderId) {
        ResultSet resultSet = orderDetailsFromDb(orderId);
    
        return dtoAssembler.orderDetailsFrom(resultSet);
    }
    
  

可能我们需要使用DTO

如您所见,两个实现都可以返回相同的DTO。使用显式DTO是解决合同和序列化问题的非常有用且流行的方法。如何将数据映射到此类DTO完全取决于您,并且有多种实施策略。