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