public virtual async Task When(Guid id, TCommand cmd) { _logger.Debug("Invoking a command {commandType} on an aggregate: {aggregateType}", cmd.GetType().Name, typeof(TAggregate).Name); var events = _eventStream.Get(id); var aggregate = new TAggregate(); aggregate.Id = id; await aggregate.RehydrateAsync(events); var version = aggregate.Version; var published = aggregate.Execute(cmd); var commitedEvents = version == 0 ? await _eventStream.Append(aggregate.Id, cmd.Id, published) : await _eventStream.Append(aggregate.Id, version - 1, cmd.Id, published); // We return events to client - think about correlation-id solution? var current = _sessionContext.Current(); if (current.IsValid) { _logger.Information("Sending events {eventsCount} on session {sessionId}.", commitedEvents.Length, current.Id); current.SendEvents(commitedEvents); } }