Ejemplo n.º 1
0
        private Func <EventStoreCatchUpSubscription, ResolvedEvent, Task> EventAppeared(
            ProjectionHandler projection,
            string projectionName
            ) => async(_, e) =>
        {
            if (e.OriginalEvent.EventType.StartsWith("$"))
            {
                return;
            }

            var @event = this._eventDeserializer.Deserialize(Type.GetType(e.Event.EventType), Encoding.UTF8.GetString(e.Event.Data));

            @event.ThrowsIfNull(new ArgumentNullException(nameof(@event)));

            await projection.Handle(@event);

            await _checkpointStore.SetLastCheckpoint(projectionName, e.OriginalPosition);

            var metadata = this._eventDeserializer.Deserialize <EventMetadata>(Encoding.UTF8.GetString(e.Event.Metadata));

            ISnapshotter snapshotStore = _snapshotters.FirstOrDefault(
                x => x.ShouldTakeSnapshot(Type.GetType(metadata.AggregateAssemblyQualifiedName), e) && !metadata.IsSnapshot);

            if (snapshotStore != null)
            {
                await snapshotStore.TakeSnapshotAsync(e.OriginalStreamId);
            }
        };