域驱动设计相关的聚合根和UI检索

时间:2013-08-27 22:58:01

标签: c# domain-driven-design

我正在努力掌握越来越多的域驱动设计并遵循最佳实践。到目前为止,这是我的理解:

  • 聚合是彼此相关的实体的集合。
  • 聚合的根是将聚合关系绑定在一起的实体。
  • 如果删除了根,则必须删除聚合范围内的所有内容
  • 聚合根只能通过身份相互引用

我的问题是:

如果我有多个相互关联的聚合,请说订单和产品类别。

应用程序服务应如何处理订单和相关产品类别的检索?

服务是否应该引用订单和产品类别的每个存储库,首先检索订单,然后检索产品类别,最后填写引用两者信息的数据传输对象?

这样的事情:

public OrderDto GetOrder(int id)
{
    var order = _orderRepo.GetById(id);

    var productCategory = _categoryRepo.GetById(order.ProductCategoryId);

    return new OrderDto 
                  { 
                     CustomerName = order.CustomerName, 
                     ProductCategoryName = productCategory.Name,
                     *..etc..*
                  };
}

或者,如果它们紧密相关,那么它是否能够保持根分离?

或者UI是否应该为完整的图片调用独立服务?

2 个答案:

答案 0 :(得分:1)

根据Reasons to break the rules section

,您可能需要违反规则

第一个是预设方便,当你只是需要一次显示一个订单时,这并不是什么大问题,但如果你需要列出订单,你提到的解决方案会导致N + 1查询问题。

替代解决方案是遵守规则并使用您的持久性对象来呈现ui(在列表Order案例中)如果您想要从持久性基础架构中分离(或已经分离)您的域模型,可以找到一些讨论{{3 }}

答案 1 :(得分:0)

在您的应用程序中使用CQRS模式似乎是一种选择。该模式非常适合DDD,因为它在这种情况下可以帮助我们,在这种情况下,我们需要使用不同的机制来读写数据,您可以在本文https://martinfowler.com/bliki/CQRS.html中阅读有关CQRS的更多信息,因此,如果要检索显示的目的是不需要获取所有聚合根,因为在读取数据时实体的不变性不会无效,即实体状态不变。