コード例 #1
0
        public EventStream <T> Load <T>(string aggregateId, int version)
        {
            if (string.IsNullOrWhiteSpace(aggregateId))
            {
                throw new ArgumentException("An aggregate ID is required", "aggregateId");
            }

            if (version == EventStreamVersion.NoStream)
            {
                throw new ArgumentOutOfRangeException("version", "By definition you cannot load a stream when specifying the EventStreamVersion.NoStream (-1) value.");
            }

            _logger.Debug(this, "Loading " + typeof(T) + " version " + EventStreamVersion.GetName(version) + " from stream " + aggregateId);

            using (var transaction = GetTransaction())
                using (var connection = GetConnection())
                {
                    connection.Open();

                    var command = connection.CreateCommand();
                    command.CommandType = CommandType.Text;
                    command.CommandText = @"select * from AggregateRootEvent where AggregateId = @aggregateId and Version <= @Version order by Version;";

                    var aggregateIdParameter = command.Parameters.Add("@AggregateId", SqlDbType.UniqueIdentifier);
                    var versionParameter     = command.Parameters.Add("@Version", SqlDbType.Int);

                    aggregateIdParameter.Value = Guid.Parse(aggregateId);
                    versionParameter.Value     = version == EventStreamVersion.Max ? int.MaxValue : version;

                    var reader = command.ExecuteReader(CommandBehavior.SequentialAccess);

                    var events = new List <IEvent>();
                    while (reader.Read())
                    {
                        events.Add((IEvent)JsonConvert.DeserializeObject(reader.GetString(3), GetJsonSerialisationSettings()));
                    }

                    if (events.Count == 0)
                    {
                        return(null);
                    }

                    var result = new EventStream <T>(aggregateId);
                    result.Append(events);

                    if (version != EventStreamVersion.Max && result.GetVersion() != version)
                    {
                        var exception = new ArgumentOutOfRangeException("version", version, string.Format("Event for version {0} could not be found for stream {1}", version, aggregateId));
                        exception.Data.Add("Existing stream", events);
                        throw exception;
                    }

                    transaction.Complete();

                    return(result);
                }
        }
コード例 #2
0
        public EventStream <T> Load <T>(string aggregateId, int version)
        {
            if (string.IsNullOrWhiteSpace(aggregateId))
            {
                throw new ArgumentException("An aggregate ID is required", "aggregateId");
            }

            if (version == EventStreamVersion.NoStream)
            {
                throw new ArgumentOutOfRangeException("version", "By definition you cannot load a stream when specifying the EventStreamVersion.NoStream (-1) value.");
            }

            _logger.Debug(this, "Loading " + typeof(T) + " version " + version + " from stream " + aggregateId);

            var streamEvents = new List <ResolvedEvent>();

            StreamEventsSlice currentSlice;
            var nextSliceStart = StreamPosition.Start;

            do
            {
                currentSlice = _eventStoreConnection.ReadStreamEventsForwardAsync(aggregateId, nextSliceStart, 200, false).Result;

                nextSliceStart = currentSlice.NextEventNumber;

                foreach (var evt in currentSlice.Events)
                {
                    streamEvents.Add(evt);
                    if (evt.OriginalEventNumber == version)
                    {
                        break;
                    }
                }
            } while (!currentSlice.IsEndOfStream);

            if (streamEvents.Count == 0)
            {
                return(null);
            }

            var domainEvents = streamEvents.Select(x => BuildDomainEvent(x.OriginalEvent.Data, x.OriginalEvent.Metadata)).ToList();
            var result       = new EventStream <T>(aggregateId);

            result.Append(domainEvents);

            if (version != EventStreamVersion.Max && result.GetVersion() != version)
            {
                var exception = new ArgumentOutOfRangeException("version", version, string.Format("Event for version {0} could not be found for stream {1}", version, aggregateId));
                exception.Data.Add("Existing stream", domainEvents);
                throw exception;
            }

            return(result);
        }
コード例 #3
0
        public Task <EventStream> LoadEventStreamAsync(IIdentity identity, int skipEvents, int maxCount)
        {
            var eventStream = new EventStream(identity, 0, events: null, timeStamp: DateTimeOffset.Now);

            foreach (var @event in _store.Where(s => s.Identity.Equals(identity))
                     .Skip((int)skipEvents)
                     .Take(maxCount))
            {
                eventStream.Append(@event);
            }
            return(Task.FromResult(eventStream));
        }
コード例 #4
0
ファイル: EventStore.cs プロジェクト: ewin66/SAE
        public async Task <EventStream> LoadEventStreamAsync(IIdentity identity, long skipEvents, int maxCount)
        {
            var eventStream = new EventStream(identity, 0, events: null, timeStamp: DateTimeOffset.MinValue);

            using (var conn = this._dbConnectionFactory.Get())
            {
                using (var reader = await conn.ExecuteReaderAsync($"select * from EventStream where id=@id and version > @skipVersion limit {maxCount}",
                                                                  new
                {
                    Id = identity.ToString(),
                    SkipVersion = skipEvents
                }))
                {
                    while (reader.Read())
                    {
                        eventStream.Append(new EventStream(identity,
                                                           reader.GetInt32(reader.GetOrdinal("version")),
                                                           reader.GetString(reader.GetOrdinal("data")),
                                                           DateTimeOffset.Parse(reader.GetString(reader.GetOrdinal("timestamp")))));
                    }
                }
            }
            return(eventStream);
        }