Slide 77
Slide 77 text
©2023 Junichi Kato 77 / 98
コマンドプロセッサの実装イメージ
(1)〜(3)は以下のように抽象化可能。
この実装では、スナップショットが利用されているとはいえ、ユースケースの実行ごとにリプレイが行われるところが
難点。Akka/Scalaではアクターとしてキャシュすることでジャーナルやスナップショットと完全に同期した状態を維持
できる。つまり、(1)から(3)が初回実行以外は不要となる。
class AddCartItemUseCase(cartPersistenceService: CartPersistenceService) {
def execute(cartId: CartId, cartVersion: Version, itemId: ItemId, num: ItemNum): Unit = {
// (1)
スナップショット取得
val snapshot = cartPersistenceService.getLatestSnapshotById(cartId)
// (2)
スナップショット以後のイベント取得
val events = cartPersistenceService.getEventsByIdAndSeqNr(cartId, snapshot.seqNr)
// (3)
最新状態に再生(
リプレイ)
val cart = Cart.from(snapshot, events)
// (4)
集約の振る舞いを実行
val (newCart, itemAdded) = cart.addItem(itemId, num)
// (5)
新しい集約状態とイベントを永続化
cartPersistenceService.store(newCart, itemAdded, cartVersion) // DynamoDB
などに書き込まれる
}
}
val cart = cartPersistenceService.replay(cartId, cartVersion)