Sobes.tech
Middle

O que é injeção de dependências (DI) no ASP.NET Core?

sobes.tech IA

Resposta da IA

A injeção de dependências (DI) é um padrão de projeto para inversão de controlo (IoC), que permite criar código desacoplado. No ASP.NET Core, a DI é uma funcionalidade incorporada que facilita a gestão de dependências entre classes.

Componentes principais da DI no ASP.NET Core:

  1. Serviços: Objetos que fornecem funcionalidades (por exemplo, classes de repositórios, serviços de registo).
  2. Contêiner DI: Objeto responsável por resolver dependências e criar instâncias de serviços.
  3. Ciclo de vida dos serviços: Define quando e como as instâncias de serviços são criadas:
    • Transient: Uma nova instância é criada a cada pedido de serviço.
    • Scoped: Uma instância por cada pedido (para aplicações web, por cada pedido HTTP).
    • Singleton: Uma instância é criada na primeira solicitação e usada durante toda a vida da aplicação.

Vantagens do uso de DI:

  • Acoplamento fraco: As classes dependem de abstrações (interfaces), não de implementações concretas.
  • Testabilidade: É fácil substituir dependências reais por "mocks" ou "stubs" em testes unitários.
  • Extensibilidade: É fácil substituir implementações de serviços sem alterar o código que depende deles.
  • Gestão de dependências: O contêiner DI gere o ciclo de vida e a criação de instâncias.

Exemplo de registo de serviços em Startup.cs (ou Program.cs no .NET 6+):

// No método ConfigureServices
public void ConfigureServices(IServiceCollection services)
{
    // Registo de serviço com ciclo de vida singleton
    services.AddSingleton<ILogger, EmailLogger>();

    // Registo de serviço com ciclo de vida scoped
    services.AddScoped<IDataRepository, SqlDataRepository>();

    // Registo de serviço com ciclo de vida transient
    services.AddTransient<ITransientService, TransientService>();

    // Registo de controladores para injeção de dependências
    services.AddControllersWithViews();
}
Injeção de dependências no construtor do controlador:

```csharp
public class HomeController : Controller
{
    private readonly ILogger _logger;
    private readonly IDataRepository _repository;

    // ASP.NET Core DI resolve e injeta automaticamente estas dependências
    public HomeController(ILogger logger, IDataRepository repository)
    {
        _logger = logger;
        _repository = repository;
    }

    // ... ações do controlador
}