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