我正在努力掌握越来越多的域驱动设计并遵循最佳实践。到目前为止,这是我的理解:
我的问题是:
如果我有多个相互关联的聚合,请说订单和产品类别。
应用程序服务应如何处理订单和相关产品类别的检索?
服务是否应该引用订单和产品类别的每个存储库,首先检索订单,然后检索产品类别,最后填写引用两者信息的数据传输对象?
这样的事情:
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是否应该为完整的图片调用独立服务?
答案 0 :(得分:1)
根据Reasons to break the rules section
,您可能需要违反规则第一个是预设方便,当你只是需要一次显示一个订单时,这并不是什么大问题,但如果你需要列出订单,你提到的解决方案会导致N + 1查询问题。
替代解决方案是遵守规则并使用您的持久性对象来呈现ui(在列表Order案例中)如果您想要从持久性基础架构中分离(或已经分离)您的域模型,可以找到一些讨论{{3 }}
答案 1 :(得分:0)
在您的应用程序中使用CQRS模式似乎是一种选择。该模式非常适合DDD,因为它在这种情况下可以帮助我们,在这种情况下,我们需要使用不同的机制来读写数据,您可以在本文https://martinfowler.com/bliki/CQRS.html中阅读有关CQRS的更多信息,因此,如果要检索显示的目的是不需要获取所有聚合根,因为在读取数据时实体的不变性不会无效,即实体状态不变。