Пример #1
0
        public async Task <Maybe <TAggregate> > GetByIdAsync(TAggregateId id)
        {
            try
            {
                var aggregate = CreateEmptyAggregate();
                IEventSourcingAggregate <TAggregateId> aggregatePersistence = aggregate;

                foreach (var @event in await eventStore.ReadEventsAsync(id))
                {
                    aggregatePersistence.ApplyEvent(@event.DomainEvent, @event.EventNumber);
                }

                if (aggregate == null)
                {
                    return(Maybe <TAggregate> .None);
                }

                return(aggregate);
            }
            catch (EventStoreAggregateNotFoundException)
            {
                return(null);
            }
            catch (EventStoreCommunicationException ex)
            {
                throw new RepositoryException("Unable to access persistence layer", ex);
            }
        }
        public async Task SaveAsync(TAggregate aggregate)
        {
            IEventSourcingAggregate <TAggregateId> aggregatePersistence = aggregate;

            foreach (var @event in aggregatePersistence.GetUncommittedEvents())
            {
                await eventStore.AppendEventAsync(@event);
            }
            aggregatePersistence.ClearUncommittedEvents();
        }
        public async Task <TAggregate> GetByIdAsync(TAggregateId id)
        {
            var aggregate = CreateEmptyAggregate();
            IEventSourcingAggregate <TAggregateId> aggregatePersistence = aggregate;

            foreach (var @event in await eventStore.ReadEventsAsync(id))
            {
                aggregatePersistence.ApplyEvent(@event.DomainEvent, @event.EventNumber);
            }
            return(aggregate);
        }
Пример #4
0
        public async Task SaveAsync(TAggregate aggregate)
        {
            try
            {
                IEventSourcingAggregate <TAggregateId> aggregatePersistence = aggregate;

                foreach (var @event in aggregatePersistence.GetUncommittedEvents())
                {
                    await eventStore.AppendEventAsync(@event);

                    await publisher.PublishAsync((dynamic)@event);
                }
                aggregatePersistence.ClearUncommittedEvents();
            }
            catch (EventStoreCommunicationException ex)
            {
                throw new RepositoryException("Unable to access persistence layer", ex);
            }
        }
Пример #5
0
        public async Task Save(IEventSourcingAggregate eventSourcingAggregate, Guid commitId, Action <IDictionary <string, object> > updateHeaders)
        {
            var commitHeaders = new Dictionary <string, object>
            {
                { CreatedByHeader, Environment.UserName },
                { CommitIdHeader, commitId },
                { AggregateClrTypeHeader, eventSourcingAggregate.GetType().AssemblyQualifiedName }
            };

            updateHeaders(commitHeaders);
            var newEvents       = eventSourcingAggregate.GetUncommittedEvents().ToList();
            var originalVersion = eventSourcingAggregate.StreamVersion - newEvents.Count;
            var expectedVersion = originalVersion == -1 ? ExpectedVersion.NoStream : ExpectedVersion.Any;

            var eventsToSave = newEvents.Select(e => ToNewStreamMessage(Guid.NewGuid(), e, commitHeaders)).ToArray();

            try
            {
                if (eventsToSave.Length < WritePageSize)
                {
                    await _store.AppendToStream(eventSourcingAggregate.StreamId, expectedVersion, eventsToSave);
                }
                else
                {
                    //TODO
                }
            }
            catch (WrongExpectedVersionException weve)
            {
                var sqlE = weve.InnerException as SqlException;
                if (sqlE?.Number == 2601)
                {
                    throw new DuplicateEventStoreAggregateException(eventSourcingAggregate.StreamId, weve);
                }
            }
            eventSourcingAggregate.ClearUncommittedEvents();
        }