できる。つまり、(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)