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