DDD - 没有延迟加载 - 如何在不耗尽数据库的情况下执行某些任务?

时间:2018-04-19 08:03:56

标签: domain-driven-design

我正在研究一个更大的解决方案的模块。 在这个解决方案中,他们过去尝试过使用DDD。 然而,由于没有DDD专家,因此没有结果。 (而且还没有一个人出席。) 一切都在一个根聚合下,启用了延迟加载,依此类推。

现在,对于新模块,我们希望让它变得更好。 但是,我没有看到如何在没有延迟加载的情况下使用DDD而不会耗尽整个数据库。

例如我有一个对象让我们称之为" B"。

B有一面旗帜让我们说#34; AwesomeFlag"

B有孩子

如果B的孩子中有一个很棒,那么B也很棒。

如果B的孩子都不是很棒,那么B并不是很棒。

现在如果我不使用DDD;我只是得到B并执行一个linq查询,检查B的孩子中有一个孩子是否真棒而没有真正检索所有孩子。

但是,如果我有一个域对象,我不允许执行查询,我该怎么做?

DDD是否迫使我让所有B的孩子只是为了得到计算出来的旗帜" IsAwesome"工作?

或者我应该如何在DDD环境中正确地执行此操作?

我需要了解一下我需要关注研究方向的一小部分提示。

更新

由于我的问题有点宽泛,所以我希望在重复使用相同的术语时保持一致。

当其中一个孩子很棒时,B很棒。

B本身,没有旗帜"棒极了"因为这是一个基于孩子的计算字段。

B可能有很多孩子,每个孩子都有一些属性和数据,你不想只检查其中一个孩子是否真棒。

B有一个方法ShouldIBecomeADeveloper 如果B的一个孩子很棒,让B很棒,它应该返回一个布尔值" true"

如果B的孩子都不是很棒,那么B不会很棒,那么它应该返回一个布尔值" false"

2 个答案:

答案 0 :(得分:1)

免责声明:虽然这在某种程度上是一个有效的问题,但它非常广泛,因此它可能有许多不同的有效答案。

您需要分析有关允许系统的有效状态的业务要求。为此,您需要回答以下问题:在B的孩子成为awesome之后, 需要B成为awesome的速度有多快?

有两个答案:

  1. 立即,在一个非常一致的问题。这意味着"令人敬畏的突变" B的孩子和#34;令人敬畏的突变" B以原子方式执行,它们处于同一事务中。在这种情况下,您必须加载B及其所有子项,然后才能改变其子项之一。 B的子节点是B Aggregate中的嵌套实体。

  2. 它可以被延迟,最终改变它的强大程度以匹配业务规则,也就是说,系统可能在一段时间处于临时无效状态。在这种情况下,B的子女也是聚合。你需要一种方法来变异B,当它过去的一个过去的孩子"变异,为此您可以使用Saga / Process经理。

  3. 在这两种情况下,你都没有使用延迟加载,在DDD聚合的情况下没有这种情况。无论如何,如果你有纯聚合,而不依赖于存储库(你应该这样做),你就无法做到。

答案 1 :(得分:1)

  

B本身,没有旗帜"棒极了"因为这是一个基于孩子的计算字段。

尽管"真棒"是一个计算字段,您对子实体执行的任何操作都必须通过" B"只是,因为它是聚合根。所以你可以在" B"称为numberOfAwesomeChildren并且只有当某些操作发生在它上面并且所有操作都通过" B"时,一个孩子才会变得很棒/不太棒。只有,只要孩子变得很棒/不可思议,你就可以更新numberOfAwesomeChildren

所以" B"当numberOfAwesomeChildren大于零时很棒。

即使这个解决方案也无法解决您的延迟加载问题,因为要对子实体执行操作,您最终将加载所有子实体。您可能需要重新审视您的设计。