1

假设我们在域中有四个实体:Product生产的、Technology定义产品类型的、Material在制造过程中使用的以及Category所属的实体Material。有很多Categories可以嵌套在类别中,层次深度没有限制。AProduct可以由 的各种组合组成Materials

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

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

就领域驱动设计而言,实现我的目标的正确方法是什么?

4

2 回答 2

1

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

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

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

请允许我引用 Eric Evan 的 dddsample:

public interface HandlingEventRepository {


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

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

于 2013-08-20T13:11:41.737 回答
1

如果我想呈现顶级列表...

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

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

据我了解,Product存储库提供的类应该只包含 的标识符Materials而材料应该只包含相关的标识符Categories。但是,仅当产品需要类别来强制执行其不变量时,这才是正确的!

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

于 2013-08-20T12:44:59.513 回答