Aggregate Snapshots
Snapshotting functionality involves the following methods:
get snapshotVersion(): number
-version
of the latest snapshotget shouldTakeSnapshot(): boolean
- defines whether a snapshot should be takentakeSnapshot(): void
- adds state snapshot to thechanges
collection, being invoked automatically by the AggregateCommandHandlermakeSnapshot(): object
- protected method used to snapshot an aggregate staterestoreSnapshot(snapshotEvent): void
- protected method used to restore state from a snapshot
If you are going to use aggregate snapshots, you either need to keep the state structure simple (it should be possible to clone it using JSON.parse(JSON.stringify(state))
) or override makeSnapshots
and restoreSnapshot
methods with your own serialization mechanisms.
In the following sample a state snapshot will be taken every 50 events and added to the aggregate changes
queue:
class UserAggregate extends AbstractAggregate {
get shouldTakeSnapshot() {
return this.version - this.snapshotVersion > 50;
}
}
If your state is too complex and cannot be restored with JSON.parse
or you have data stored outside of aggregate state
, you should define your own serialization and restoring functions:
class UserAggregate extends AbstractAggregate {
makeSnapshot() {
// return a field, stored outside of this.state
return { trickyField: this.trickyField };
}
restoreSnapshot({ payload }) {
this.trickyField = payload.trickyField;
}
}