コード例 #1
0
        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 => {
                var localEvent = e as INotification;
                (aggregateRoot as IEntity).AddDomainEvent(localEvent);
            });

            this._unitOfworkAsync.Attach(aggregateRoot);

            return(aggregateRoot);
        }
コード例 #2
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 snapshotStreamName = $"{StreamExtensions.GetStreamName(typeof(TAggregateRoot), keyValues[0].ToString())}-Snapshot";

            Optional <Snapshot> snapshot = await _snapshotReader.ReadOptional(snapshotStreamName);

            var version = StreamPosition.Start;

            if (snapshot.HasValue)
            {
                version = snapshot.Value.Version + 1;
            }

            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);

            if (snapshot.HasValue)
            {
                root.RestoreSnapshot(snapshot.Value.State);
            }
            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);
        }