如何保证聚合根内部一致性

    
EricGogh
13-10-10 3 687 1

根据邻域驱动设计,聚合根内部是保证强一致性的。
但是假如是聚合根内部的实体元素分别来自不同的数据库,那么如何保证这些元素之间是相互一致的呢
[该贴被EricGogh于2013-10-10 15:41修改过]

1
banq
2013-10-10 16:03

2013-10-10 15:39 "@EricGogh
"的内容
但是假如是聚合根内部的实体元素分别来自不同的数据库,那么如何保证这些元素之间是相互一致的呢 ...


强一致性是逻辑业务上的一致性,因为有逻辑强一致性,所以才有聚合,才有聚合根保证这种强一致性。与数据库等技术概念无关。
在DDD中先后关系:业务逻辑--->领域模型---->数据库。

EricGogh
2013-10-10 16:15

那么请问如何保持读操作中数据的一致性呢?
分别还原数据库中的数据到返回对象中,比如一个对象包含A,B两个元素,但是返回的时候取得的A是最新的,而B因为某些原因取得的是未更新前的旧的数据。
[该贴被EricGogh于2013-10-10 16:15修改过]

banq
2013-10-10 16:31

2013-10-10 16:15 "@EricGogh
"的内容
分别还原数据库中的数据到返回对象中 ...

这是依靠仓储和工厂来保证整个聚合内对象的生命周期一致性,值得注意的是,聚合的状态是系统核心,业务状态的时刻变化是反映在内存中的聚合体内,而不是数据库中,只有在服务器启动或内存不够情况下,我们才需要使用数据库来存储内存中对象,然后还原成对象。

在CQRS架构中,我们甚至只使用数据库来保存导致状态变化的事件,这样通过eventSourcing来保证聚合内部状态变化的一致性,根本不使用数据库来保存状态,这样完全杜绝数据库用来持久化聚合对象的用法,ORM等工具毫无用处之地。