Пример #1
0
        private async Task <int> SendToStreamAsync()
        {
            int eventCount = 0;

            foreach (Aggregate aggregate in _aggregates.Values)
            {
                EventData[] changes = (aggregate.Root as IEntity).DomainEvents
                                      .Select(@event => new EventData(
                                                  Guid.NewGuid(),
                                                  @event.GetType().TypeQualifiedName(),
                                                  true,
                                                  Encoding.UTF8.GetBytes(this._serializer.Serialize(@event)),
                                                  Encoding.UTF8.GetBytes(this._serializer.Serialize(new EventMetadata
                {
                    TimeStamp     = DateTime.Now,
                    AggregateType = aggregate.Root.GetType().Name,
                    AggregateAssemblyQualifiedName = aggregate.Root.GetType().AssemblyQualifiedName,
                    IsSnapshot = false
                }))
                                                  )).ToArray();
                try
                {
                    await this._connection.AppendToStreamAsync(StreamExtensions.GetStreamName(aggregate), aggregate.ExpectedVersion, changes);

                    eventCount = eventCount + changes.Length;
                }
                catch (WrongExpectedVersionException ex)
                {
                    throw ex;
                }
            }
            return(eventCount);
        }
        public async Task <TAggregateRoot> FindAsync(params object[] keyValues)
        {
            string            streamName = StreamExtensions.GetStreamName(typeof(TAggregateRoot), keyValues[0].ToString());
            StreamEventsSlice slice      =
                await
                _connection.ReadStreamEventsForwardAsync(streamName, StreamPosition.Start, 20,
                                                         false);

            if (slice.Status == SliceReadStatus.StreamDeleted || slice.Status == SliceReadStatus.StreamNotFound)
            {
                return(null);
            }

            var aggregateRoot = (TAggregateRoot)Activator.CreateInstance(typeof(TAggregateRoot), true);
            var events        = await GetEvents(streamName);

            events.ForEach(e =>
            {
                (aggregateRoot as IEntity).ApplyEvent(e);
            });

            (aggregateRoot as IEntity).ClearEvents();

            var aggregate = new Aggregate(keyValues[0].ToString(), (int)slice.LastEventNumber, aggregateRoot);

            this._unitOfworkAsync.Attach(aggregate);

            return(aggregateRoot);
        }
Пример #3
0
        public async Task <TAggregateRoot> FindAsync(params object[] keyValues)
        {
            var existingAggregate = _unitOfworkAsync.AttachedObject(keyValues[0].ToString());

            if (existingAggregate != null)
            {
                return((TAggregateRoot)(((Aggregate)existingAggregate).Root));
            }
            var streamName = StreamExtensions.GetStreamName(typeof(TAggregateRoot), keyValues[0].ToString());

            var version = StreamPosition.Start;

            StreamEventsSlice slice =
                await
                _connection.ReadStreamEventsForwardAsync(streamName, version, 100, false);

            if (slice.Status == SliceReadStatus.StreamDeleted || slice.Status == SliceReadStatus.StreamNotFound)
            {
                throw new AggregateNotFoundException($"Aggregate not found by {streamName}");
            }

            TAggregateRoot root = (TAggregateRoot)Activator.CreateInstance(typeof(TAggregateRoot), true);

            slice.Events.ToList().ForEach(e =>
            {
                var resolvedEvent = this._serializer.Deserialize(Type.GetType(e.Event.EventType, true), Encoding.UTF8.GetString(e.Event.Data));
                (root as IEntity).ApplyEvent(resolvedEvent);
            });

            while (!slice.IsEndOfStream)
            {
                slice =
                    await
                    _connection.ReadStreamEventsForwardAsync(streamName, slice.NextEventNumber, 100,
                                                             false);

                slice.Events.ToList().ForEach(e =>
                {
                    var resolvedEvent = this._serializer.Deserialize(Type.GetType(e.Event.EventType, true), Encoding.UTF8.GetString(e.Event.Data));
                    (root as IEntity).ApplyEvent(resolvedEvent);
                });
            }

            (root as IEntity).ClearEvents();

            var aggregate = new Aggregate(keyValues[0].ToString(), (int)slice.LastEventNumber, root);

            this._unitOfworkAsync.Attach(aggregate);

            return(root);
        }