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:
- Query: Obtenção dos dados
- Parse: Transformação dos dados
- 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étodoQuery()
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étodoParse()
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
resultimplementaIEnumerable: 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étricasIntegrationExecutionContext: Contexto de execução com informações da integraçãoIntegrationResult<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