💻 Exemplos: Capítulo 18: Injeção de Dependências e Logging Estruturado
💻 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.