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

How to Implement DDD repository pattern using raw JDBC or Mybatis?

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

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

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

然后我使用存储库来持久化所有更改

arRepo.update(ar)

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

主要难度是:

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

主要原则是您的 DDD 核心应该对 JDBC、TCP 或 ORM 一无所知。它所知道的一切都应该用通用语言来表达。

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

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

然后您需要将此事件列表缩减为某处的读取模型,但如果您使用此方法,这不是 AR 的责任。

当我提到决策制定时,我指的是不进入磁盘或网络获取数据的纯函数。这意味着,所有必要的数据都应该在决策之前收集起来,并在决策之后保存下来。进入应用层。

而这个应用层是与存储库或网络适配器交互的。它还可以处理事务等。接下来,计算 SQL UPDATE 查询是存储库的实现细节。但是只要状态变化是用通用语言表达的,它就可以被聚合和领域核心所熟知。