如何使用原始JDBC或Mybatis实现DDD存储库模式?

时间:2019-04-24 02:44:13

标签: domain-driven-design ddd-repositories

假设我有一个复杂的聚合根(AR)

在用户交易中,我将该AR倍增:

ar.doSomeThing1();
ar.doSomething2();
ar.doSomething3();
ar.doSomething4();

然后我使用存储库来保存所有更改

arRepo.update(ar)

我的问题是如何使用JDBC或Mybatis实现arRepo.update

主要困难是:

  1. arRepo不知道更改了什么,唯一的方法是更新数据库中的所有ar数据。

1 个答案:

答案 0 :(得分:2)

主要原理是您的DDD内核对JDBC,TCP或ORM一无所知。它所知道的一切都应该用一种无所不在的语言来表达。

但这并不意味着它不应该知道发生了什么变化。您可以使用某种事件源并将事件保存在AR中,从而可以从中导出必要的更新。

也许这不是非常面向对象的,但是您可以尝试一下。实际上,AR可以表示为决策者,他获得更改状态的请求,决定接受还是拒绝这些请求,然后存储状态更改事件的列表。

然后,您需要将该事件列表简化为某个地方的读取模型,但这不是AR的责任,如果您使用这种方法。

当我提到决策时,我指的是一个纯函数,它不会进入磁盘或网络以获取数据。这意味着,所有必要的数据应在决策之前收集,并在之后保留。到应用程序层。

此应用程序层是与存储库或网络适配器进行交互的人员。它还可以处理交易等。接下来,计算SQL UPDATE查询是存储库的实现细节。但是,只要状态变化是用无处不在的语言来表达的,聚合和领域核心就可以众所周知。