如何将几个存储库的结果合并到一个结果集中,而不会在Domain中创建过多的耦合?

时间:2013-08-20 12:02:45

标签: domain-driven-design ddd-repositories

想象一下,我们在域中有四个实体:Product生成,Technology定义产品类型,Material在制造过程中使用Category Material所属的。有许多Categories可以嵌套在类别中,层次结构深度没有限制。 Product可以由Materials的各种组合制作。

假设我们通过添加或删除某些父Technology来定义Categories。然后,我们根据Product创建Technology,并添加/删除属于Materials子树的某些Technology's Categories'

如果我想使用属于某个Categories的{​​{1}}子树的Materials呈现顶级Categories列表,我的Product必须知道ProductRepository的内部工作(例如,嵌套树实现)才能有效。否则我最终会加载一堆集合并失去RDBMS的所有好处。

在域驱动设计方面达到目标的正确方法是什么?

2 个答案:

答案 0 :(得分:1)

  

如果我想渲染一个顶级列表...

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

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

据我所知,存储库提供的Product类应仅包含Materials的{​​{3}},且材料应仅包含identifiers相关的Categories。但是,只有在产品要求类别强制执行其不变量时才会出现这种情况!

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

答案 1 :(得分:1)

如果你想要一些Category:

,我想把这个方法放在CategoryRepository中
public interface CategoryRepository {
    List<Category> findWithMaterialsOfCategoriesSubtreesBeloningTo(ProductId productId);
}

据我所知,了解产品结构是实现这一目标的唯一可行且有效的方法。

请允许我引用Eric Evan的例子:

public interface HandlingEventRepository {


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

如果要求更改为退回未装运货物的所有HandlingEvent,该怎么办?然后我必须加入t_cargo和t_handling_event并过滤“where t_cargo.status =?”。