Ejemplo n.º 1
0
        /// <summary>
        ///     Loads and returns an aggregate by id, from the store.
        /// </summary>
        public async Task <T> Load <T>(string aggregateId, CancellationToken cancellationToken = default)
            where T : Aggregate, new()
        {
            if (IsNullOrWhiteSpace(aggregateId))
            {
                throw new ArgumentException("Value cannot be null or whitespace.", nameof(aggregateId));
            }

            var stream    = _getStreamName(typeof(T), aggregateId);
            var aggregate = new T();

            var nextPageStart = 0L;

            do
            {
                var page = await _connection.ReadStreamEventsForwardAsync(
                    stream, nextPageStart, MaxReadSize, false, _userCredentials);

                aggregate.Load(page.Events.Select(resolvedEvent =>
                {
                    var dataType = _typeMapper.GetType(resolvedEvent.Event.EventType);
                    var data     = _serializer.Deserialize(resolvedEvent.Event.Data, dataType);
                    return(data);
                }).ToArray());

                nextPageStart = !page.IsEndOfStream ? page.NextEventNumber : -1;
            } while (nextPageStart != -1);

            Log.Debug("Loaded {aggregate} changes from stream {stream}", aggregate, stream);

            return(aggregate);
        }
Ejemplo n.º 2
0
        /// <summary>
        ///     Loads and returns an aggregate by id, from the store.
        /// </summary>
        public async Task <T> Load <T>(string aggregateId, CancellationToken cancellationToken = default)
            where T : Aggregate, new()
        {
            var stream    = _getStreamName(typeof(T), aggregateId);
            var aggregate = new T();

            var nextPageStart = 0L;

            do
            {
                var page = await _connection.ReadStreamEventsForwardAsync(
                    stream, nextPageStart, MaxReadSize, false, _userCredentials);

                aggregate.Load(page.Events.Select(resolvedEvent =>
                {
                    var dataType = _typeMapper.GetType(resolvedEvent.Event.EventType);
                    var data     = _serializer.Deserialize(resolvedEvent.Event.Data, dataType);
                    return(data);
                }).ToArray());

                nextPageStart = !page.IsEndOfStream ? page.NextEventNumber : -1;
            } while (nextPageStart != -1);

            return(aggregate);
        }
Ejemplo n.º 3
0
        private Action <EventStoreCatchUpSubscription, ResolvedEvent> EventAppeared(Projection projection) =>
        async(_, e) =>
        {
            // always double check if it is a system event ;)
            if (e.OriginalEvent.EventType.StartsWith("$"))
            {
                return;
            }

            // get the configured clr type name for deserializing the event
            var eventType = _typeMapper.GetType(e.Event.EventType);

            // try to execute the projection
            await projection.Handle(_serializer.Deserialize(e.Event.Data, eventType));

            // store the current checkpoint
            await _checkpointStore.SetCheckpoint(e.OriginalPosition, projection);
        };
        /// <summary>
        ///     Loads and returns an aggregate by id, from the store.
        /// </summary>
        public async Task <T> Load <T>(string aggregateId) where T : Aggregate, new()
        {
            var stream    = _getStreamName(typeof(T), aggregateId);
            var aggregate = new T();

            var page = await _connection.ReadStreamEventsForwardAsync(
                stream, 0, 1000, false, _userCredentials);

            aggregate.Load(page.Events.Select(resolvedEvent =>
            {
                var dataType = _typeMapper.GetType(resolvedEvent.Event.EventType);
                var data     = JsonConvert.DeserializeObject(
                    Encoding.UTF8.GetString(resolvedEvent.Event.Data), dataType, DefaultSettings);
                return(data);
            }).ToArray());

            return(aggregate);
        }