O container Microsoft.Extensions.DependencyInjection
ResumoO .NET traz um container de DI nativo. Você registra os serviços (interface → implementação) e o container resolve e constrói o grafo de objetos para você. É a base do ASP.NET Core.
1. Objetivos de Aprendizagem#
- Registrar serviços no container nativo.
- Resolver dependências automaticamente.
- Conhecer o
IServiceCollectione oIServiceProvider.
2. Pré-requisitos#
- Conceito de DI e IoC (tópico 12.1).
3. Conceito#
O pacote Microsoft.Extensions.DependencyInjection fornece:
IServiceCollection: onde você registra os serviços.IServiceProvider: o container construído, que resolve instâncias.
Você mapeia IRepositorio → RepositorioSql; ao pedir um ServicoProduto, o container vê que ele precisa de IRepositorio, cria a implementação registrada e injeta — recursivamente, montando todo o grafo. O porquê: você para de escrever "fiação" manual (new encadeados) e centraliza a composição.
4. Mão na Massa#
4.1. Setup#
dotnet new console -n Catalog.Container
cd Catalog.Container
dotnet add package Microsoft.Extensions.DependencyInjection
4.2. Implementação Passo a Passo#
- Serviços:
public interface IRepositorioProduto { string Nome(Guid id); }
public class RepositorioProduto : IRepositorioProduto
{
public string Nome(Guid id) => "Mouse";
}
public class ServicoProduto
{
private readonly IRepositorioProduto _repo;
public ServicoProduto(IRepositorioProduto repo) => _repo = repo;
public string Descrever(Guid id) => $"Produto: {_repo.Nome(id)}";
}
- Registro e resolução:
using Microsoft.Extensions.DependencyInjection;
var services = new ServiceCollection();
services.AddScoped<IRepositorioProduto, RepositorioProduto>();
services.AddScoped<ServicoProduto>();
using ServiceProvider provider = services.BuildServiceProvider();
var servico = provider.GetRequiredService<ServicoProduto>(); // grafo montado automaticamente
Console.WriteLine(servico.Descrever(Guid.NewGuid()));
Notano ASP.NET Core você não cria a
ServiceCollectionà mão — ela é obuilder.Services. Os controllers recebem serviços por injeção de construtor automaticamente.
4.3. Executando#
dotnet run
5. Exemplo Completo#
Registrar IRepositorioProduto e ServicoProduto e pedir GetRequiredService<ServicoProduto>() faz o container resolver toda a cadeia — a mesma mecânica que o ASP.NET Core usa para injetar serviços nos controllers.
6. Boas Práticas e Armadilhas#
| Faça | Evite |
|---|---|
Registrar por interface (Add...) | Registrar sempre pelo concreto sem abstração |
Usar GetRequiredService (falha clara se não registrado) | GetService e ignorar o null retornado |
| Deixar o container montar o grafo | Voltar a instanciar dependências manualmente |
Atençãoesquecer de registrar um serviço gera erro em runtime ("Unable to resolve service..."). O container só resolve o que foi registrado.
7. Segurança e Produção#
- Centralizar o registro facilita trocar implementações por ambiente (ex.: um serviço de e-mail real em produção e um fake em desenvolvimento).
8. Exercícios#
- Fácil: registre uma interface e sua implementação e resolva-a.
- Médio: adicione um segundo serviço que dependa do primeiro e resolva o grafo.
- Desafio: provoque o erro "unable to resolve" removendo um registro e interprete a mensagem.
9. Resumo#
O container nativo (IServiceCollection/IServiceProvider) registra e resolve dependências automaticamente, montando o grafo de objetos. É a fundação da DI no ASP.NET Core.
10. Próximos Passos#
A seguir, o detalhe que mais gera bugs: os lifetimes.
11. Referências#
- Microsoft Learn — Injeção de dependência no .NET
- Microsoft Learn — Uso da injeção de dependência
- Microsoft Learn — IServiceCollection