想象一下,我们在域中有四个实体:Product
生成,Technology
定义产品类型,Material
在制造过程中使用Category
Material
所属的。有许多Categories
可以嵌套在类别中,层次结构深度没有限制。 Product
可以由Materials
的各种组合制作。
假设我们通过添加或删除某些父Technology
来定义Categories
。然后,我们根据Product
创建Technology
,并添加/删除属于Materials
子树的某些Technology's Categories'
。
如果我想使用属于某个Categories
的{{1}}子树的Materials
呈现顶级Categories
列表,我的Product
必须知道ProductRepository
的内部工作(例如,嵌套树实现)才能有效。否则我最终会加载一堆集合并失去RDBMS的所有好处。
在域驱动设计方面达到目标的正确方法是什么?
答案 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 =?”。