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