public async Task <IActionResult> Execute <TIn, TOut>(TIn data, string operation, Func <TIn, Task <TOut> > funcTask, AbstractValidator <TIn> validator = null, string validatorRuleSet = "")
        {
            using (LogContext.PushProperty("data", JsonConvert.SerializeObject(data)))
            {
                _logger.LogInformation($"Inicio - {operation}");

                try
                {
                    if (!(validator is null))
                    {
                        validator.Validate(data, options => options.IncludeRuleSets(validatorRuleSet).IncludeRulesNotInRuleSet().ThrowOnFailures());
                    }

                    var result = await funcTask.Invoke(data);

                    return(Ok(BaseResponse <TOut> .GetSuccess(result)));
                }
                catch (ValidationException vEx)
                {
                    _logger.LogError(vEx.Message, $"Erro - {operation}");

                    return(StatusCode((int)HttpStatusCode.BadRequest, BaseResponse <object> .GetError(vEx.Errors)));
                }
                catch (CustomApplicationException caEx)
                {
                    _logger.LogError(caEx.Message, $"Erro - {operation}");

                    return(StatusCode((int)caEx.StatusCode, BaseResponse <object> .GetError(caEx.Code, caEx.Message)));
                }
                catch (Exception ex)
                {
                    _logger.LogError(ex, $"Erro - {operation}");

                    return(StatusCode((int)HttpStatusCode.InternalServerError, BaseResponse <object> .GetError("ErroGeral", ex.Message)));
                }
                finally
                {
                    _logger.LogInformation($"Fim - {operation}");
                }
            }
        }