DDD。直接从存储库或使用实体读取?

时间:2013-09-18 08:16:39

标签: .net wcf domain-driven-design

我正在开发一个新系统的后端,我会尝试使用DDD。我在Core项目中定义了我的DDD实体,并使用存储库模式从持久层中读取这些实体。

我需要一个WCF服务,以便我的客户端可以访问后端。在此WCF服务之间,我发送/接收DTO。

假设我有一个典型的Order,Orderrows场景。在我的WCF服务中,我声明了一个函数

IEnumerable<DTO.OrderRows> GetOrderRowsForOrder(DTO.Order o)

我需要建议如何实现此方法。我有两种不同的选择。

  1. 使用我的域对象来阅读订单。

    Core.Order order = _orderRepository.GetById(o.Id);
    IEnumerable<Core.OrderRow> orderRows = order.GetOrderRows();
    IEnumerable<DTO.OrderRows> dtos = orderRows.Select(x => x.ToDTO());
    
    return dtos;
    
  2. 直接使用存储库阅读订单。

    IEnumerable<Core.OrderRow> orderRows = _orderRowsRepository.GetOrderRowsForOrder(o.Id);
    IEnumerable<DTO.OrderRows> dtos = orderRows.Select(x => x.ToDTO());
    
    return dtos;
    
  3. 对我来说,选择1看起来更“面向对象”,但选择号。 2看起来更简单,更有效。

    我的问题是,使用DDD时要使用哪一个?在这里使用DDD是否合适?

    (这当然是一个简单的示例,但如果我需要为订单列表获取订单呢?)

3 个答案:

答案 0 :(得分:4)

这取决于你的聚合根源:

  1. 如果订单是包含订单行的聚合根,那么Order应该有一个属性OrderRows,当您阅读订单时,该属性将始终填充。因此,从订单获取订单行时不会涉及“低效率”,因为它们已经存在于内存中。
  2. 如果OrderRow本身就是一个聚合根,那么OrderRows上会有没有 GetOrderRows属性或Order方法。相反,您可以使用OrderRowsRepository获取订单的所有订单行,类似于您在第二个示例中概述的内容。

答案 1 :(得分:2)

我一直在使用数字2但最近改变了我的想法更多的是1号。原因是,如果你使用2,存储库最终会被所有类型的方法弄乱,以询问存储库的事情域对象(实体)应该知道并能够回答。用你自己的话说;它更面向对象。

答案 2 :(得分:0)

假设Core.Order是您的聚合根,那么OrderRows中已经有一个属性,例如

public class Order
{
    public IEnumerable<Core.OrderRows> Rows { get; set; }

}

因此,选择#1稍加修改以调用Rows属性而不是使用GetOrderRows()进行查询是合适的。

Core.Order order = _orderRepository.GetById(o.Id);
IEnumerable<Core.OrderRow> orderRows = order.Rows;
IEnumerable<DTO.OrderRows> dtos = orderRows.Select(x => x.ToDTO());

return dtos;