/// <summary>
        /// Executes a command by its name with specified arguments.
        /// </summary>
        /// <param name="correlationId">Unique correlation/transaction id.</param>
        /// <param name="command">Command name.</param>
        /// <param name="args">Command arguments.</param>
        /// <returns>Execution result.</returns>
        public Task <object> ExecuteAsync(string correlationId, string command, Parameters args)
        {
            var cref = FindCommand(command);

            if (cref == null)
            {
                throw new BadRequestException(
                          correlationId,
                          "CMD_NOT_FOUND",
                          "Request command does not exist"
                          )
                      .WithDetails("command", command);
            }

            if (correlationId == null)
            {
                correlationId = IdGenerator.NextShort();
            }

            var results = cref.Validate(args);

            ValidationException.ThrowExceptionIfNeeded(correlationId, results, false);

            return(cref.ExecuteAsync(correlationId, args));
        }