💻 Exemplos: Capítulo 18: Injeção de Dependências e Logging Estruturado

Especialização em Sistemas com C# • Demonstrações Práticas Compiláveis


🎯 Objetivo dos Exemplos

Apresentar a arquitetura corporativa padrão do .NET com o contêiner de Inversão de Controle (IoC Container): configuração de serviços através de IServiceCollection, ciclo de vida de instâncias (Transient, Scoped, Singleton) e emissão de mensagens rastreáveis com Logging Estruturado via Microsoft.Extensions.Logging.ILogger.


1. Código Fonte Completo (Program.cs)

/**
 * @file Program.cs
 * @brief Injeção de Dependências (DI), ciclos de vida de serviços e logging estruturado no .NET 8.
 */

using System;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;

Console.WriteLine("=== CAPÍTULO 18: INJEÇÃO DE DEPENDÊNCIA E LOGGING ESTRUTURADO ===");

// 1. Interfaces e Implementações do Domínio
public interface IRelogioSistema { DateTime ObterDataAtualUtc(); }
public class RelogioSistema : IRelogioSistema
{
    public DateTime ObterDataAtualUtc() => DateTime.UtcNow;
}

public interface IRepositorioTelemetria { void SalvarRegistro(string sensorId, double valor); }
public class RepositorioTelemetria(ILogger<RepositorioTelemetria> logger) : IRepositorioTelemetria
{
    public void SalvarRegistro(string sensorId, double valor)
    {
        // Logging Estruturado: parâmetros nomeados preservam propriedades pesquisáveis em ferramentas como Seq/Elastic
        logger.LogInformation("Persistindo telemetria: SensorId={SensorId}, Valor={Valor:F2}", sensorId, valor);
    }
}

public class ProcessadorAlertas(IRepositorioTelemetria repo, IRelogioSistema relogio, ILogger<ProcessadorAlertas> logger)
{
    public void Processar(string sensorId, double valor)
    {
        logger.LogInformation("Processando leitura as {DataUtc}...", relogio.ObterDataAtualUtc());
        repo.SalvarRegistro(sensorId, valor);
    }
}

// 2. Configuração do ServiceCollection (Contêiner IoC)
ServiceCollection servicos = new();

// Configuração do Sistema de Logging do Console
servicos.AddLogging(builder =>
{
    builder.AddSimpleConsole(opcoes =>
    {
        opcoes.IncludeScopes = false;
        opcoes.SingleLine = true;
        opcoes.TimestampFormat = "[HH:mm:ss] ";
    });
    builder.SetMinimumLevel(LogLevel.Information);
});

// Registro de Serviços com seus Escopos
servicos.AddSingleton<IRelogioSistema, RelogioSistema>();        // Uma única instância compartilhada
servicos.AddScoped<IRepositorioTelemetria, RepositorioTelemetria>(); // Uma por escopo de requisição
servicos.AddTransient<ProcessadorAlertas>();                     // Nova instância a cada injeção

// 3. Compilação do ServiceProvider
using ServiceProvider provedor = servicos.BuildServiceProvider();

// 4. Execução dentro de um Escopo Controlado (Scope)
Console.WriteLine("\n--- Criando Escopo de Injeção de Dependências ---");
using (IServiceScope escopo = provedor.CreateScope())
{
    var processador = escopo.ServiceProvider.GetRequiredService<ProcessadorAlertas>();
    processador.Processar("SENSOR_VIBRAÇÃO_A1", 8.45);
}

Console.WriteLine("Escopo de servico encerrado com sucesso.");

2. Instruções de Compilação e Execução

# Criar projeto e adicionar os pacotes oficiais de DI e Logging
dotnet new console -n AppInjecaoDep -f net8.0
cd AppInjecaoDep
dotnet add package Microsoft.Extensions.DependencyInjection
dotnet add package Microsoft.Extensions.Logging.Console
dotnet run

3. Saída Esperada no Terminal

=== CAPÍTULO 18: INJEÇÃO DE DEPENDÊNCIA E LOGGING ESTRUTURADO ===

--- Criando Escopo de Injeção de Dependências ---
[05:00:00] info: ProcessadorAlertas[0] Processando leitura as 28/09/2026 05:00:00...
[05:00:00] info: RepositorioTelemetria[0] Persistindo telemetria: SensorId=SENSOR_VIBRAÇÃO_A1, Valor=8.45
Escopo de servico encerrado com sucesso.