Domain driven design DDD:聚合边界与合成便利性。

Domain driven design DDD:聚合边界与合成便利性。,domain-driven-design,aggregate,Domain Driven Design,Aggregate,我正在开始一个新的DDD项目,我觉得我还没有真正掌握这些概念。到目前为止,我在我的领域有两个聚合根,Recipe和Food。他们的关系是这样的: `Recipe`->*`Ingredient`->`Food` 一种配料是一种数量+一种食品 我认为在配方集合中使用集合(食品)可能不好,但它确实很方便,因为它允许通过导航关系来计算配方的营养价值 我也不会存储计算结果,每次都会重新计算,因此如果食物被更改,食谱会自动更新,我不知道这是否是个好主意 另外,是否可以为配方+配料建立一个单独的

我正在开始一个新的DDD项目,我觉得我还没有真正掌握这些概念。到目前为止,我在我的领域有两个聚合根,
Recipe
Food
。他们的关系是这样的:

`Recipe`->*`Ingredient`->`Food`
一种
配料
是一种数量+一种
食品

我认为在
配方
集合中使用集合(
食品
)可能不好,但它确实很方便,因为它允许通过导航关系来计算配方的营养价值

我也不会存储计算结果,每次都会重新计算,因此如果食物被更改,食谱会自动更新,我不知道这是否是个好主意

另外,是否可以为
配方
+
配料
建立一个单独的存储库,因为它们位于同一个聚合中,我必须加载所有配料,这样我就可以将它们传递到配方的构造函数中

因为配方+配料在同一个集合中,所以我必须加载所有配料,这样我就可以将它们传递到配方的构造函数中,所以可以为配方+配料创建一个单独的存储库吗

这就是大多数人所期望的——一个加载聚合边界中包含的所有状态的单一存储库

我认为也许在配方集合中包含集合(食物)是不好的,但它确实很方便,因为它允许通过导航关系来计算配方的营养价值

  • 弊大于利
  • 这在使用简化域来发现如何使用DDD时并不明显
聚合的动机是约束模型中数据的更改方式,以便每次更改都使模型处于内部一致状态

如果您的域没有任何要强制实施的一致性约束(例如,当您的数据模型实际上只是一个数据库,并且数据模型对提议的更改没有否决权时),那么问题空间就不会在选择好的聚合边界方面提供很多指导

聚合背后的基本原则是,您正在创建一种数据防火墙,您永远不必担心对该聚合的更改会违反该聚合的规则。这意味着,除其他外,任何两个聚合都不应该共享可变数据

共享值很好——每个聚合都有自己的值的不可变副本,更改一个聚合中的值不会影响另一个聚合。共享实体是不好的,因为实体是可变的

拥有一个能够让生成错误答案的查询变得非常方便的模型并没有一个能够确保答案正确的模型那么有价值

通常情况下,一个聚合将通过ID引用另一个聚合

`Recipe`->*`Ingredient`->`Id<Food>`
`Recipe`->*`component`->`Id`
Id
只是另一个不可变的值类型;食谱可以很容易地改变它使用的食物,但它不能以任何方式改变食物。这反过来意味着你不必担心改变一个
配方会破坏另一个

因为配方+配料在同一个集合中,所以我必须加载所有配料,这样我就可以将它们传递到配方的构造函数中,所以可以为配方+配料创建一个单独的存储库吗

这就是大多数人所期望的——一个加载聚合边界中包含的所有状态的单一存储库

我认为也许在配方集合中包含集合(食物)是不好的,但它确实很方便,因为它允许通过导航关系来计算配方的营养价值

  • 弊大于利
  • 这在使用简化域来发现如何使用DDD时并不明显
聚合的动机是约束模型中数据的更改方式,以便每次更改都使模型处于内部一致状态

如果您的域没有任何要强制实施的一致性约束(例如,当您的数据模型实际上只是一个数据库,并且数据模型对提议的更改没有否决权时),那么问题空间就不会在选择好的聚合边界方面提供很多指导

聚合背后的基本原则是,您正在创建一种数据防火墙,您永远不必担心对该聚合的更改会违反该聚合的规则。这意味着,除其他外,任何两个聚合都不应该共享可变数据

共享值很好——每个聚合都有自己的值的不可变副本,更改一个聚合中的值不会影响另一个聚合。共享实体是不好的,因为实体是可变的

拥有一个能够让生成错误答案的查询变得非常方便的模型并没有一个能够确保答案正确的模型那么有价值

通常情况下,一个聚合将通过ID引用另一个聚合

`Recipe`->*`Ingredient`->`Id<Food>`
`Recipe`->*`component`->`Id`

Id
只是另一个不可变的值类型;食谱可以很容易地改变它使用的食物,但它不能以任何方式改变食物。这反过来意味着你不必担心改变一个
配方会打破另一个。

如果你正在发明自己的DDD学习项目,“编辑”是一个非常糟糕的领域。寻找模型可以自己做决定的地方。如果你正在发明自己的项目来学习DDD,“编辑”是一个非常糟糕的领域。寻找一个模型可以自己做决定的地方。从那时起,我如何获得食物礼仪?我把它们都复制到配料中了吗?如果你的聚合边界画得正确,你就永远不需要修改食物了