Domain driven design 如何将多个存储库的结果合并到一个结果集中,而不在域中创建太多耦合?

Domain driven design 如何将多个存储库的结果合并到一个结果集中,而不在域中创建太多耦合?,domain-driven-design,ddd-repositories,Domain Driven Design,Ddd Repositories,假设我们在域中有四个实体:生产的产品,定义产品类型的技术,制造过程中使用的材料,材料所属的类别。有许多类别可以嵌套在类别中,层次结构深度没有限制。产品可以由材料的各种组合制成 假设我们通过添加或删除某些父类别来定义技术。然后,我们基于技术创建产品,并添加/删除属于技术类别子树的某些材料 如果我想用属于某个产品的类别子树的材料呈现顶级类别列表,我的产品存储库必须知道类别存储库的内部工作方式(例如嵌套树实现)才能有效。否则,我将加载大量集合,并失去RDBMS的所有好处 在领域驱动设计方面,实现我的目

假设我们在域中有四个实体:
生产的产品
定义产品类型的技术
制造过程中使用的材料
材料所属的类别
。有许多
类别
可以嵌套在类别中,层次结构深度没有限制。
产品
可以由
材料的各种组合
制成

假设我们通过添加或删除某些父
类别来定义
技术
。然后,我们基于
技术创建
产品
,并添加/删除属于
技术类别
子树的某些
材料

如果我想用属于某个
产品的
类别
子树的
材料
呈现顶级
类别
列表,我的
产品存储库
必须知道
类别存储库
的内部工作方式(例如嵌套树实现)才能有效。否则,我将加载大量集合,并失去RDBMS的所有好处

在领域驱动设计方面,实现我的目标的正确方法是什么

如果我想呈现一个顶级的列表

“呈现”是一个表示问题:它不应该影响域模型的设计

因此,如果您只需要显示此类视图,只需使用您可以编写的最佳SQL查询即可

据我所知,存储库提供的
产品
类应该只包含
材料
的类,材料应该只包含相关
类别
的类。然而,只有当产品需要类别来强制其不变量时,这才是正确的


然而,根据您对需求的描述,我不会采用DDD方法,而是采用更简单的CRUD方法。根据经验,如果您不需要雇用领域专家来理解业务逻辑(并且如果您可以将所有业务规则重新导入RDBMS约束),则不需要DDD。

如果您需要某个类别,我想将该方法放在CategoryRepository中:

public interface CategoryRepository {
    List<Category> findWithMaterialsOfCategoriesSubtreesBeloningTo(ProductId productId);
}

如果要求更改为返回未装运货物的所有搬运事件,该怎么办?然后我必须加入t_cargo和t_处理事件,并通过“where t_cargo.status=?”进行过滤

我完全同意渲染部分-这与域无关。然而,如果需要展示这样的结果,那么稍后可能会需要与之互动。我想我可能在这里看不到一个重要的实体或关系。我的问题被简化了,实际的领域要复杂得多——我们尝试了CRUD方法,但失败得很惨。无论如何,感谢您的输入。我没有质疑这种关系,但对其建模的方法是:不要使用内存中的对象引用,只使用标识符(它们是廉价的值对象)。但是,通过你的评论,我会考虑如果你正在处理一个投影(因此SQL建议仍然适用)不同的有界上下文。如果将域拆分成不同的有界上下文可以减少认知负载:例如,您可能有一个产品管理的上下文和一个用于材料分类的上下文。
public interface HandlingEventRepository {


   /**
    * @param trackingId cargo tracking id
    * @return The handling history of this cargo
    */
    HandlingHistory lookupHandlingHistoryOfCargo(TrackingId trackingId);
}