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
            });
        }
示例#2
0
        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);
        }
示例#3
0
        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
            });
        }