domain-driven-design - 如何使用原始 JDBC 或 Mybatis 实现 DDD 存储库模式?
问题描述
假设我有一个复杂的聚合根 (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 查询是存储库的实现细节。但是只要用通用语言来表达一个状态的变化,它就可以被聚合和领域核心所熟知。
推荐阅读
- google-cloud-platform - GCP 实例之间的高速通信
- javascript - 选择器参数已更改,但未调用渲染
- swift - 在 SwiftUI 视图中嵌入视频
- python - 剪切 os.system 的输出的一行并将其写入文件
- laravel - 是否值得创建 2 个单独的 Laravel 项目?
- powershell - 如何将变量从 Windows 窗体传递给 exe
- python - 从没有包依赖的 yml 文件创建 conda 环境
- swiftui - InputAccessoryView / 使用 SwiftUI 固定到键盘的视图
- c - 指向字符串的指针以及赋值和取消引用之间的区别
- c# - 如何在 C# 中将数字转换为无符号短(始终为 16 位,大端字节序)