同じコンテキストの集約間の整合性
TL;DR;
基本は 1 つのトランザクションにつき 1 つの集約のみを更新する
1 つのトランザクションで複数の集約を更新するケースもある
典型例: 2 つの口座間の送金
そのまま実装もできるが、リファクタリング のきっかけになる
e.g. トランザクションを エンティティ と見なす
hr.icon
同じ 境界づけられたコンテキスト 内にある 集約 間で 整合性 を確保する
一般的には「1 つのトランザクションにつき 1 つの集約のみを更新する」
複数の集約が同じ境界づけられたコンテキストにあったとしても、メッセージ と 結果整合性 を利用すべき
異なるコンテキスト間での整合性
「1 つのトランザクションで複数の集約を更新する」のが良いケースもある
ワークフロー が 1 つのトランザクションであると考えられるケース
典型例: 2 つの口座間の送金
code:text
Start transaction
Add X amount to accountA
Remove X amount to accountB
Commit transaction
口座が Account 集約で表されている場合、同じトランザクションで 2 つの集約を処理することに
これでも問題ではないが、リファクタリング のきっかけに
トランザクション自体が独自の アイデンティティ を持つと考えることができる
つまりトランザクションが エンティティ radish-miyazaki.icon
code:fsharp
type MoneyTransfer = {
Id: MoneyTransferId
ToAccount: AccountId
FromAccount: AccountId
Amount: Money
}