经过大量的阅读和思考发生,因为我开始我的头缠着DDD,我有点困惑了聚合下复杂的层次处理的最佳实践根。我认为这是一个常见问题,但在阅读了无数的例子和讨论之后,没有人会谈论我所看到的问题。请说明如何创建/更新对一个聚合根的子实体
如果我与DDD思想一致,总根下的实体应该是一成不变的。这是我麻烦的症结,所以如果那是不正确的,那就是我迷失的原因。
这是一个捏造的例子......希望它拥有足够的水来讨论。
考虑汽车保险单(我没有保险,但这个手机上,当我听到的语言相匹配瓦特/我的保险公司)。
政策显然是一个实体。在政策中,假设我们有Auto。自动,为了这个例子,只存在于一个策略中(也许你可以将一个自动转移到另一个策略,所以这也是一个聚合的潜力,它改变了策略......但假设它比现在简单) 。由于Auto没有策略就无法存在,我认为它应该是一个实体而不是根。所以在这种情况下的策略是一个聚合根。
现在,为了创建策略,让我们假设它必须至少有一个auto。这是我感到沮丧的地方。假设汽车相当复杂,包括许多领域,也可能是一个孩子在哪里被保存(一个位置)。如果我理解正确,“创建策略”构造函数/工厂必须将输入作为自动或通过构建器进行限制,以便在没有此自动构建器的情况下不会创建。而汽车的创造,因为它是一个实体,不能事先做(因为它是不可变的,也许这只是一个不正确的解释)。所以你不必说新的Auto,然后setX,setY,add(Z)。
如果汽车超过有点微不足道,你最终不得不建立建设者一个巨大的层次结构,这样,试图管理政策的框架内建立一个汽车。
还有一个转折,这是后来,在创建策略后,一个希望添加其他自动...或更新现有的汽车。很显然,策略控制着这个......很好......但是Policy.addAuto()不会飞得太高,因为不能只传递一个新的Auto(right !?)。示例中提到了诸如Policy.addAuto(VIN,make,model等),但都很简单,看起来很合理。但是,如果这种工厂方法崩溃的参数太多(整个自动接口,可以想象)我需要一个解决方案。
从我的思想这一点上,我意识到,有一个短暂的参考实体的确定。所以,也许这是很好有一个短暂的环境聚集内其父之外创建一个实体,所以也许它是确定这样说:
自动= AutoFactory.createAuto(); auto.setX auto.setY
,或者坚持不变性,AutoBuilder.new()。setX的()。塞蒂()建()
再有,当你说政策得到它整理出来.addAuto(自动)
这个保险例如,如果您添加活动,如用其PolicyReports或RepairEstimates ...一定的价值,但对象是所有的政策外的真正意义的大多数实体事故变得更有趣......在至少我的简单例子。
策略的生命周期随着时间的推移逐渐增长,似乎是我真正开始挖掘之前必须绘制的基本图景......它更多的是工厂概念或者子实体如何构建/附加到聚合根我还没有看到一个坚实的例子。
我想我很近。希望这是明确的,而不仅仅是一个重复的常见问题解答,它可以解答所有问题。
基督徒,我认为聚合的主要问题是有界的一致性,或者我会说的事务一致性。问这个问题。您需要制定政策的实际最低限度信息是什么?只是创造。所有你可能需要的东西很少,以使其“有效”。然后,你的ASSIGN,它是一个汽车,(政策不建立AUTOS)。得到它了?我为一家保险公司工作。我不会太担心政策。它首先从一个报价开始,然后是一个领先。因此,您所要做的就是通过从收集的数据中推断出身份,将所有信息“绑定”到某项政策。 – 2012-12-17 18:16:32