MJM*_*MJM 9 modeling domain-driven-design aggregate invariants
在DDD中,聚合不变量包括基于另一个聚合中的信息的规则吗?现在我不这么认为,但是这会给我带来麻烦,我不知道如何解决它.
我有一个名为Asset(设备)的实体,我将其建模为聚合的根.它有一个标签(属性)列表,用于描述制造商,模型等等.它存储名为AssetType的第二个聚合的标识,其中包含TagType列表,其中一些可以标记为必需.
现在在我看来,Asset的一个不变条件应该引用相关的AssetType,以在强制标记列表中强制执行非空值.但是,我的内心正在考虑如何强制执行一致性.
这是否意味着聚合应该真正包含所有四个实体?如果根目录是AssetType并且它下面有一个Assets列表,那么它可以解决我的问题,但是这不适合核心用例,其中包含维护不同类型资产列表的其他聚合.资产真的必须是根,否则我会遇到问题.
并且AssetType也不能很好地进入Asset聚合.这似乎是荒谬的.
我的胆量仍然说资产和资产类型是两个独立的聚合,但我如何解决一致性问题?或者我有不变的错误?
在这种情况下,有几种方法可以强制执行不变量.
首先,考虑Asset聚合周围的行为.我假设至少有一个CreateAssetCommand和一个RemoveTagCommand.在执行这些命令期间,应按以下方式强制执行不变量:
CreateAssetCommand
由于资产始终与资产类型相关联,因此AssetTypeId必须将此资产作为此命令的一部分提供.呼叫者必须通过查找特定资产类型来获取此ID.当AssetType被查找,对应的TagType实体也可以被检索,特别是强制性的.这将允许调用者构造所需的Tag实例以作为命令的一部分发送.请注意,调用者有责任提供有效的资产类型和标记.
RemoveTagCommand
此命令的处理程序可以检索适当的Asset存储AssetTypeId.接下来,处理程序检索资产类型的强制标记集,并确保不删除这些标记.在这种情况下,不变量由处理程序本身强制执行.
处理这些不变量的另一种方法是引入最终的一致性(如果可接受的话).使用这种方法,从资产中删除标签应该发布一个TagRemovedEvent.然后,此事件的处理程序可以验证是否未删除强制标记.如果是,则可以创建任务或通知,指出资产处于无效状态.请注意,这假定在更正某些内容之前资产处于无效状态是可以接受的.
现在到周围的行为AssetType.一个可能损害Asset聚合完整性的命令是引入新的强制性命令Tag.在这种情况下,确保完整性的onyl方法是为每个相应的资产创建适当的标签.由于这可能无法自动完成,因此必须接受最终的一致性,直到通过手动干预提供适当的标签.
通过所有这些方法,您无法获得RDMS所具有的完整性.强制执行交叉聚合不变量的责任委托给命令处理程序,事件处理程序和调用代码.但是,在许多情况下,这种一致性是完全可以接受的.
有关详细信息,请参阅有效聚合设计.