public async Task CreateOrUpdateSnapshotPayloadAsync(string aggregateRootId, string aggregateRootTypeName, int publishedVersion, string payload) { var snapshot = new Snapshot() { Id = ObjectId.GenerateNewId(), CreationTime = DateTime.UtcNow, ModificationTime = DateTime.UtcNow, AggregateRootId = aggregateRootId, AggregateRootTypeName = aggregateRootTypeName, Version = publishedVersion, Payload = payload, }; var filter = Builders <Snapshot> .Filter .Eq(s => s.AggregateRootId, snapshot.AggregateRootId); var update = Builders <Snapshot> .Update .Set(s => s.ModificationTime, snapshot.ModificationTime) .Set(s => s.Version, snapshot.Version) .Set(s => s.Payload, snapshot.Payload) .SetOnInsert(s => s.Id, snapshot.Id) .SetOnInsert(s => s.CreationTime, snapshot.CreationTime) .SetOnInsert(s => s.AggregateRootId, snapshot.AggregateRootId) .SetOnInsert(s => s.AggregateRootTypeName, snapshot.AggregateRootTypeName); await _snapshotCollection .GetCollection(aggregateRootId) .UpdateOneAsync(filter, update, new UpdateOptions() { IsUpsert = true }); }
public async Task <IAggregateRoot> RestoreFromSnapshotAsync(Type aggregateRootType, string aggregateRootId) { var snapshot = await _snapshotCollection .GetCollection(aggregateRootId) .Find(s => s.AggregateRootId == aggregateRootId) .FirstOrDefaultAsync(); if (snapshot == null) { return(null); } return(_aggregateSnapshotSerializer.Deserialize(snapshot.Payload, aggregateRootType) as IAggregateRoot); }
public async Task SaveSnapshotAsync(IAggregateRoot aggregateRoot, Type aggregateRootType, int publishedVersion) { if (aggregateRoot == null) { throw new ArgumentNullException(nameof(aggregateRoot)); } if (publishedVersion % _aggregateSnapshotConfiguration.VersionInterval != 0) { return; } var copiedAggregateRoot = DeepCopier.Copy(aggregateRoot); var aggregateRootJson = _aggregateSnapshotSerializer.Serialize(copiedAggregateRoot); var aggregateRootTypeName = _typeNameProvider.GetTypeName(aggregateRootType); var snapshot = new Snapshot() { Id = ObjectId.GenerateNewId(), CreationTime = DateTime.UtcNow, ModificationTime = DateTime.UtcNow, AggregateRootId = copiedAggregateRoot.UniqueId, AggregateRootTypeName = aggregateRootTypeName, Version = copiedAggregateRoot.Version, Payload = aggregateRootJson, }; var filter = Builders <Snapshot> .Filter .Eq(s => s.AggregateRootId, snapshot.AggregateRootId); var update = Builders <Snapshot> .Update .Set(s => s.ModificationTime, snapshot.ModificationTime) .Set(s => s.Version, snapshot.Version) .Set(s => s.Payload, snapshot.Payload) .SetOnInsert(s => s.Id, snapshot.Id) .SetOnInsert(s => s.CreationTime, snapshot.CreationTime) .SetOnInsert(s => s.AggregateRootId, snapshot.AggregateRootId) .SetOnInsert(s => s.AggregateRootTypeName, snapshot.AggregateRootTypeName); await _snapshotCollection .GetCollection(copiedAggregateRoot.UniqueId) .UpdateOneAsync(filter, update, new UpdateOptions() { IsUpsert = true }); }