Pular para o conteúdo principal

TODO: Ajustar isso daqui pra explicar sobre integradores e deixar a doc de BaseIntegrator para uma referência técnica

BaseIntegrator<TInput, TOutput>

A classe abstrata BaseIntegrator<TInput, TOutput> é uma base para implementar integrações padronizadas com métricas, tratamento de erros e execução controlada.

Visão Geral

Esta classe fornece um framework estruturado para executar integrações seguindo o padrão ETL (Extract, Transform, Load) com monitoramento de métricas e tratamento centralizado de erros.

Assinatura

public abstract class BaseIntegrator<TInput, TOutput>

Parâmetros de Tipo

  • TInput: Tipo dos dados de entrada (resultado da consulta)
  • TOutput: Tipo dos dados de saída (após processamento e envio)

Funcionalidades Principais

🔄 Fluxo de Execução Padronizado

A classe implementa um fluxo de execução consistente:

  1. Query: Obtenção dos dados
  2. Parse: Transformação dos dados
  3. Send: Envio/processamento dos dados

📊 Métricas Automáticas

  • Contagem de execuções
  • Contagem de erros por tipo
  • Métricas de tempo por etapa
  • Métricas de throughput (registros processados)

🛡️ Tratamento de Erros

  • Captura e tratamento centralizado de exceções
  • Logging automático de contexto de erro
  • Retorno padronizado com IntegrationResult<TOutput>

Métodos Abstratos

Os seguintes métodos devem ser implementados pelas classes filhas:

Query()

protected abstract Task<TInput> Query();

Responsabilidade: Obter os dados que serão processados pela integração.

Retorna: Os dados brutos do tipo TInput.

Parse(TInput data)

protected abstract Task<TOutput> Parse(TInput data);

Responsabilidade: Transformar os dados de entrada no formato necessário.

Parâmetros:

  • data: Dados obtidos pelo método Query()

Retorna: Dados transformados do tipo TOutput.

Send(TOutput parsedData)

protected abstract Task<TOutput> Send(TOutput parsedData);

Responsabilidade: Enviar ou processar os dados transformados.

Parâmetros:

  • parsedData: Dados transformados pelo método Parse()

Retorna: Resultado final do tipo TOutput.

Métodos Virtuais

Hooks de Execução

PreExecution()

protected virtual void PreExecution()

Executado antes do início do fluxo principal. Útil para inicializações específicas.

PostExecution(TOutput result)

protected virtual void PostExecution(TOutput result)

Executado após o sucesso do fluxo principal. Útil para limpeza ou logging adicional.

Parâmetros:

  • result: Resultado final da integração

OnError(Exception ex)

protected virtual void OnError(Exception ex)

Executado quando ocorre uma exceção durante a execução.

Parâmetros:

  • ex: Exceção capturada

Comportamento padrão: Escreve a mensagem de erro no console.

Métodos de Validação

ValidateQuery(TInput data)

protected virtual void ValidateQuery(TInput data)

Valida os dados obtidos pela consulta.

Comportamento padrão: Lança exceção se data for null.

ValidateParse(TOutput parsedData)

protected virtual void ValidateParse(TOutput parsedData)

Valida os dados após o processamento.

Comportamento padrão: Lança exceção se parsedData for null.

Métrica de Throughput

GetRecordCount(TOutput result)

protected virtual int GetRecordCount(TOutput result)

Calcula o número de registros processados para métricas de throughput.

Comportamento padrão:

  • Se result implementa IEnumerable: retorna a contagem de itens
  • Caso contrário: retorna 1

Método de Execução

ExecuteInternal(Func<Task<TInput>> queryFactory)

protected async Task<IntegrationResult<TOutput>> ExecuteInternal(Func<Task<TInput>> queryFactory)

Método principal que orquestra toda a execução da integração.

Parâmetros:

  • queryFactory: Factory function para obtenção dos dados

Retorna: IntegrationResult<TOutput> indicando sucesso ou falha

Como Usar

Esta classe não deve ser herdada diretamente. Em vez disso, use uma das implementações públicas:

  • Para integração baseada em mensagens: herde de MessageProcessorIntegrator<TMessage, TInput, TOutput>
  • Para integração baseada em polling: herde de PoolingIntegrator<TInput, TOutput>

Consulte a documentação específica de cada implementação para exemplos de uso.

Dependências

  • IIntegrationMetricProvider: Interface para coleta de métricas
  • IntegrationExecutionContext: Contexto de execução com informações da integração
  • IntegrationResult<T>: Classe de resultado padronizada

Considerações de Performance

  • Todas as etapas principais são medidas automaticamente
  • O contexto de execução é gerenciado automaticamente
  • Métricas são coletadas de forma não-invasiva ao fluxo principal