データの永続化とトランザクションについて、nrsさんの『ボトムアップドメイン駆動設計 後編』の『3. トランザクション』を基本にいくつかの解法を比較してみます。
『ボトムアップドメイン駆動設計』で例示されているのは、
- A) アプリケーションサービスでトランザクションスコープを定義するもの。
- B) Unit of Workパターンで、Unit of Workが複数のリポジトリを持ちながらトランザクションを制御するもの。
の2つ。
MediatR の作者の Jimmy Bogard が ContosoUniversityCore でやっているのは、
- Unit of Work として SchoolContext を定義するよ、アプリケーション全体でそれを使うよ。
- 全体で使うからアクションフィルタでトランザクションの開始と終了をコントロールするよ。
というパターン。
dotnet-architecture/eShopOnContainers では、
- リポジトリが Unit of Work を持つよ。
- この Unit of Work は Mediator のインスタンスを持つよ。
- Unit of Work で変更を保存する前に、この Mediator がそれまでに発生したドメインイベントを全てDBに反映するよ。
というパターン。
いちばんリッチなのは eShopOnContainers のやり方ですが、アプリケーションの規模に合わせて上手く実装したいですね。