我正在开发一个新系统的后端,我会尝试使用DDD。我在Core项目中定义了我的DDD实体,并使用存储库模式从持久层中读取这些实体。
我需要一个WCF服务,以便我的客户端可以访问后端。在此WCF服务之间,我发送/接收DTO。
假设我有一个典型的Order,Orderrows场景。在我的WCF服务中,我声明了一个函数
IEnumerable<DTO.OrderRows> GetOrderRowsForOrder(DTO.Order o)
我需要建议如何实现此方法。我有两种不同的选择。
使用我的域对象来阅读订单。
Core.Order order = _orderRepository.GetById(o.Id);
IEnumerable<Core.OrderRow> orderRows = order.GetOrderRows();
IEnumerable<DTO.OrderRows> dtos = orderRows.Select(x => x.ToDTO());
return dtos;
直接使用存储库阅读订单。
IEnumerable<Core.OrderRow> orderRows = _orderRowsRepository.GetOrderRowsForOrder(o.Id);
IEnumerable<DTO.OrderRows> dtos = orderRows.Select(x => x.ToDTO());
return dtos;
对我来说,选择1看起来更“面向对象”,但选择号。 2看起来更简单,更有效。
我的问题是,使用DDD时要使用哪一个?在这里使用DDD是否合适?
(这当然是一个简单的示例,但如果我需要为订单列表获取订单呢?)
答案 0 :(得分:4)
这取决于你的聚合根源:
Order
应该有一个属性OrderRows
,当您阅读订单时,该属性将始终填充。因此,从订单获取订单行时不会涉及“低效率”,因为它们已经存在于内存中。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;