2

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

我需要 WCF 服务,以便我的客户可以访问后端。往返此 WCF 服务是我发送/接收 DTO。

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

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

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

  1. 使用我的域对象来读取 orderrows。

    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. 直接使用存储库读取 orderrows。

    IEnumerable<Core.OrderRow> orderRows = _orderRowsRepository.GetOrderRowsForOrder(o.Id);
    IEnumerable<DTO.OrderRows> dtos = orderRows.Select(x => x.ToDTO());
    
    return dtos;
    

对我来说,选择 1 看起来更“面向对象”,但选择没有。2看起来更简单,更有效。

我的问题是,使用 DDD 时应该使用哪一个?在这里使用 DDD 合适吗?

(这当然是一个简单的示例,但是如果我需要获取 orderrows 以获取订单列表怎么办?)

4

3 回答 3

4

这取决于您的聚合根:

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

我一直在使用数字 2,但最近我的想法也改变了数字 1。这样做的原因是,如果您使用 2,存储库最终将充满各种询问域对象的存储库的方法(实体)应该知道并能够回答。用你自己的话说;它更面向对象。

于 2013-09-18T08:36:28.207 回答
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;
于 2013-09-19T18:35:40.587 回答