假设我有一个复杂的聚合根(AR)
在用户交易中,我将该AR倍增:
ar.doSomeThing1();
ar.doSomething2();
ar.doSomething3();
ar.doSomething4();
然后我使用存储库来保存所有更改
arRepo.update(ar)
我的问题是如何使用JDBC或Mybatis实现arRepo.update
?
主要困难是:
arRepo
不知道更改了什么,唯一的方法是更新数据库中的所有ar
数据。 答案 0 :(得分:2)
主要原理是您的DDD内核对JDBC,TCP或ORM一无所知。它所知道的一切都应该用一种无所不在的语言来表达。
但这并不意味着它不应该知道发生了什么变化。您可以使用某种事件源并将事件保存在AR中,从而可以从中导出必要的更新。
也许这不是非常面向对象的,但是您可以尝试一下。实际上,AR可以表示为决策者,他获得更改状态的请求,决定接受还是拒绝这些请求,然后存储状态更改事件的列表。
然后,您需要将该事件列表简化为某个地方的读取模型,但这不是AR的责任,如果您使用这种方法。
当我提到决策时,我指的是一个纯函数,它不会进入磁盘或网络以获取数据。这意味着,所有必要的数据应在决策之前收集,并在之后保留。到应用程序层。
此应用程序层是与存储库或网络适配器进行交互的人员。它还可以处理交易等。接下来,计算SQL UPDATE查询是存储库的实现细节。但是,只要状态变化是用无处不在的语言来表达的,聚合和领域核心就可以众所周知。