public async Task <IEnumerable <object> > GetEventStream <TAggregate>(Guid id) where TAggregate : IAggregate, new() { var streamName = StreamName($"{typeof(TAggregate).Name }-{id}"); var eventNumber = 0; StreamEventsSlice currentSlice; var eventStream = new List <object>(); do { currentSlice = await _eventStoreConnection.ReadStreamEventsForwardAsync(streamName, eventNumber, ReadPageSize, false); if (currentSlice.Status == SliceReadStatus.StreamNotFound) { throw new AggregateNotFoundException(id, typeof(TAggregate)); } if (currentSlice.Status == SliceReadStatus.StreamDeleted) { throw new AggregateDeletedException(id, typeof(TAggregate)); } eventNumber = (int)currentSlice.NextEventNumber; foreach (var resolvedEvent in currentSlice.Events) { eventStream.Add(_eventDeserializer.Deserialize(resolvedEvent.Event)); } } while (!currentSlice.IsEndOfStream); return(eventStream); }
public async Task Subscribe(string streamName, Func <Guid, object, Task> messageSender) { await DefaultRetryAsync(() => SubscribeImpl()); async Task SubscribeImpl() { await CreateSubscription(); await _conn.ConnectToPersistentSubscriptionAsync( streamName, _options.GroupSubscription, (_, x) => messageSender( GetAggregateId(x.Event.EventStreamId), _eventDeserializer.Deserialize(x.Event))); Guid GetAggregateId(string streamId) { var streamIdParts = streamId.Split('-'); return(streamIdParts.Length == 2 ? Guid.TryParse(streamIdParts[1], out Guid aggregateId) ? aggregateId : Guid.Empty : Guid.Empty); } async Task CreateSubscription() { var settings = PersistentSubscriptionSettings.Create() .ResolveLinkTos() .StartFromCurrent(); await _conn.CreatePersistentSubscriptionAsync(streamName, _options.GroupSubscription, settings, _options.Credentials); } } }