0

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

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

我的问题是:

如果我有多个彼此相关的聚合,比如说订单和产品类别。

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

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

像这样的东西:

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 是否应该调用独立服务以获得完整的画面?

4

2 回答 2

1

根据“违反规则的原因”部分,在某些情况下您可能必须违反规则

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

替代解决方案是遵守规则并使用您的持久性对象来呈现 ui(在列表 Order 情况下),如果您想从持久性基础设施中分离(或已经分离)您的域模型,可以在这里找到一些讨论。

于 2013-08-28T00:58:55.317 回答
0

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

于 2020-08-27T11:37:54.430 回答