Pular para o conteúdo
.NETConfigurando e testando o serviço via DI
Módulo 03Construindo a Web API

Configurando e testando o serviço via DI

iniciante 30 min de leitura·Atualizado · .NET 9
Resumo

Implementamos ILoggerManager sobre o provedor de logging e registramos o serviço no contêiner de DI como Singleton. Depois validamos escrevendo logs a partir de um controller.

1. Objetivos de Aprendizagem#

  • Implementar ILoggerManager reaproveitando o ILogger<T> nativo.
  • Registrar o serviço no contêiner de DI com o tempo de vida correto.
  • Injetar e testar o logger a partir de um controller.

2. Pré-requisitos#

  • Interface ILoggerManager definida (tópico 16.5).

3. Conceito#

Injeção de Dependência (DI) é a técnica de fornecer as dependências de uma classe de fora, em vez de a classe criá-las. IoC (Inversão de Controle) é o princípio: o controle da criação passa para o contêiner. O porquê: baixo acoplamento e testabilidade — o controller não sabe qual implementação de log está sendo usada.

A implementação a seguir usa o próprio ILoggerFactory do framework, evitando dependência de terceiros e mantendo o log estruturado.

4. Mão na Massa#

4.1. Setup#

Nenhum pacote de terceiros é necessário — usamos Microsoft.Extensions.Logging, já presente.

4.2. Implementação Passo a Passo#

  1. Implemente a interface em Catalog.LoggerService:
C#
using Catalog.Contracts;
using Microsoft.Extensions.Logging;

namespace Catalog.LoggerService;

public sealed class LoggerManager : ILoggerManager
{
    private readonly ILogger<LoggerManager> _logger;

    public LoggerManager(ILogger<LoggerManager> logger) => _logger = logger;

    public void LogInfo(string message)  => _logger.LogInformation("{Message}", message);
    public void LogWarn(string message)  => _logger.LogWarning("{Message}", message);
    public void LogDebug(string message) => _logger.LogDebug("{Message}", message);
    public void LogError(string message) => _logger.LogError("{Message}", message);
}
  1. Registre no contêiner (método de extensão):
C#
public static IServiceCollection ConfigureLoggerService(this IServiceCollection services) =>
    services.AddSingleton<ILoggerManager, LoggerManager>();
  1. Chame no Program.cs:
C#
builder.Services.ConfigureLoggerService();

4.3. Executando#

Injete e use em um controller de teste:

C#
[ApiController]
[Route("api/[controller]")]
public class WeatherController : ControllerBase
{
    private readonly ILoggerManager _logger;
    public WeatherController(ILoggerManager logger) => _logger = logger;

    [HttpGet]
    public IActionResult Get()
    {
        _logger.LogInfo("Requisição GET /weather recebida.");
        _logger.LogDebug("Detalhe de depuração.");
        return Ok(new { status = "ok" });
    }
}
Shell
dotnet run
# em outro terminal:
curl http://localhost:5000/api/weather

No console você verá as mensagens nos níveis configurados.

5. Exemplo Completo#

C#
// Program.cs (trecho)
builder.Services.ConfigureLoggerService();
builder.Services.ConfigureControllers();

var app = builder.Build();
app.MapControllers();
app.Run();

6. Boas Práticas e Armadilhas#

FaçaEvite
Registrar o logger como Singleton (é thread-safe e sem estado)Registrar como Scoped sem necessidade
Usar templates estruturados ("{Message}")Concatenar com $"..." perdendo os campos
Injetar a interface, não a implementaçãoInstanciar new LoggerManager(...) manualmente
Atenção

níveis de log são filtrados por appsettings.json. Se LogDebug não aparece, verifique o LogLevel do ambiente — em produção Debug normalmente está desligado.

7. Segurança e Produção#

  • Ajuste LogLevel.Default para Information ou Warning em produção; Debug/Trace podem vazar detalhes internos.
  • Centralize logs (arquivo rotacionado, Seq, Elastic, Application Insights) e proteja o acesso a eles.
  • Reforço de compliance: jamais logue segredos ou PII (LGPD).

8. Exercícios#

  • Fácil: troque o LogLevel.Default para Warning em appsettings.Production.json e observe o efeito.
  • Médio: substitua a implementação por uma baseada em Serilog sem alterar quem consome ILoggerManager.
  • Desafio: escreva um teste unitário que verifica que o controller chama LogInfo (use um mock de ILoggerManager).

9. Resumo#

Implementamos ILoggerManager sobre o logging nativo, registramos como Singleton e validamos via controller. A abstração permite trocar o provedor sem tocar no restante do código.

10. Próximos Passos#

Módulo 17: estruturamos a aplicação com Onion Architecture, EF Core e as camadas de repositório e serviço.

11. Referências#

16-06 — Configurando e testando o serviço via DI | Curso ASP.NET Core