我正在研究一个更大的解决方案的模块。 在这个解决方案中,他们过去尝试过使用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"
答案 0 :(得分:1)
免责声明:虽然这在某种程度上是一个有效的问题,但它非常广泛,因此它可能有许多不同的有效答案。
您需要分析有关允许系统的有效状态的业务要求。为此,您需要回答以下问题:在B
的孩子成为awesome
之后, 需要B
成为awesome
的速度有多快?
有两个答案:
立即,在一个非常一致的问题。这意味着"令人敬畏的突变" B的孩子和#34;令人敬畏的突变" B以原子方式执行,它们处于同一事务中。在这种情况下,您必须加载B及其所有子项,然后才能改变其子项之一。 B的子节点是B Aggregate中的嵌套实体。
它可以被延迟,最终改变它的强大程度以匹配业务规则,也就是说,系统可能在一段时间处于临时无效状态。在这种情况下,B的子女也是聚合。你需要一种方法来变异B,当它过去的一个过去的孩子"变异,为此您可以使用Saga / Process经理。
在这两种情况下,你都没有使用延迟加载,在DDD聚合的情况下没有这种情况。无论如何,如果你有纯聚合,而不依赖于存储库(你应该这样做),你就无法做到。
答案 1 :(得分:1)
B本身,没有旗帜"棒极了"因为这是一个基于孩子的计算字段。
尽管"真棒"是一个计算字段,您对子实体执行的任何操作都必须通过" B"只是,因为它是聚合根。所以你可以在" B"称为numberOfAwesomeChildren
并且只有当某些操作发生在它上面并且所有操作都通过" B"时,一个孩子才会变得很棒/不太棒。只有,只要孩子变得很棒/不可思议,你就可以更新numberOfAwesomeChildren
。
所以" B"当numberOfAwesomeChildren
大于零时很棒。
即使这个解决方案也无法解决您的延迟加载问题,因为要对子实体执行操作,您最终将加载所有子实体。您可能需要重新审视您的设计。