コード例 #1
0
        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);
        }
コード例 #2
0
        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);
                }
            }
        }