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:
- Serviços: Objetos que fornecem funcionalidades (por exemplo, classes de repositórios, serviços de registo).
- Contêiner DI: Objeto responsável por resolver dependências e criar instâncias de serviços.
- 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
}