Pular para o conteúdo
.NETO container Microsoft.Extensions.DependencyInjection
Módulo 02Fundamentos de Aplicação

O container Microsoft.Extensions.DependencyInjection

intermediario 28 min de leitura·Atualizado · .NET 9
Resumo

O .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 IServiceCollection e o IServiceProvider.

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#

Shell
dotnet new console -n Catalog.Container
cd Catalog.Container
dotnet add package Microsoft.Extensions.DependencyInjection

4.2. Implementação Passo a Passo#

  1. Serviços:
C#
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)}";
}
  1. Registro e resolução:
C#
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()));
Nota

no ASP.NET Core você não cria a ServiceCollection à mão — ela é o builder.Services. Os controllers recebem serviços por injeção de construtor automaticamente.

4.3. Executando#

Shell
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çaEvite
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 grafoVoltar a instanciar dependências manualmente
Atenção

esquecer 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#

12-02 — O container Microsoft.Extensions.DependencyInjection | Curso ASP.NET Core