首页 > 解决方案 > 如何使用原始 JDBC 或 Mybatis 实现 DDD 存储库模式?

问题描述

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

在用户事务中,我多次使用此 AR:

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

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

arRepo.update(ar)

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

主要困难是:

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

标签: domain-driven-designddd-repositories

解决方案


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

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

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

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

当我提到决策时,我的意思是一个纯粹的函数,它不会去磁盘或网络获取数据。这意味着,所有必要的数据都应该在决策之前收集并在之后保留。那就是应用层。

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


推荐阅读