CURSO NOVO - BLAZOR SERVER

balta.io balta.io
  • Cursos
  • Carreiras
  • Para sua Empresa
  • Agenda
  • Blog

Seja Premium
balta.io

  • Cursos
  • Carreiras
  • Para sua Empresa
  • Agenda
  • Blog
  • Player
Seja Premium

Entre ou Cadastre-se

  • Home
  • Artigos
  • AddTransient, AddScoped, AddSingleton


AddTransient, AddScoped, AddSingleton

Injeção de Dependência é uma técnica que implementa um princípio de design chamado de IoC. Neste artigo vamos aprender a utilizá-las no ASP.NET.

Injeção de Dependência no ASP.NET

O ASP.NET possui recursos nativos para trabalharmos com Dependency Injection (Injeção de Dependência) de forma simples e fácil.

Porém, precisamos entender como ele resolve as dependências para aproveitar melhor estes recursos e não cometer possíveis erros.

Caso esteja com dúvidas em relação a DI, sugiro que veja este artigo no qual abordo mais a fundo o assunto.

Versão em vídeo

IMAGE ALT TEXT HERE

Criando dependências

Antes de resolver as dependências, precisamos entender o que são dependências. E o código abaixo ilustra bem esta visão, note que temos uma dependência do ICustomerRepository.

public class OrderController : Controller
{
    private readonly ICustomerRepository _repository;

    public OrderController(ICustomerRepository repository)
    {
        _repository = repository;
    }
}

Isto ocorre pois no construtor do nosso controlador, explicitamos a necessidade de uma abstração ou implementação externa, tornando impossível instanciar um OrderController sem informar um ICustomerRepository.

Acredite se quiser, mas isto é tudo o que precisamos para criar uma dependência no ASP.NET. Porém agora vem o segundo problema... resolvê-las.

Resolvendo dependências

Existem três formas de resolver dependências no ASP.NET, AddTransient, AddScoped e AddSingleton, e todas estão ligadas ao tempo de vida do objeto resolvido.

Em todos os cenários, iremos resolver as dependências no Program.cs, antes do builder.Services.AddControllers por exemplo.

builder.Services.AddTransient<IInterface, Classe>();
builder.Services.AddScoped<IInterface, Classe>();
builder.Services.AddSingleton<IInterface, Classe>();

A resolução sempre será dada pela abstração (Interface) seguida da implementação (Classe concreta), apenas pela classe concreta ou por uma nova instância do objeto.

builder.Services.AddTransient<Classe>();
builder.Services.AddScoped(new Classe());

AddTransient

Embora a resolução seja parecida, o tempo de vida é bem diferente. No caso do AddTransient por exemplo, você sempre terá uma nova instância do objeto.

builder.Services.AddTransient<ICustomerRepository, CustomerRepository>();

...

public class OrderController : Controller
{
    private readonly ICustomerRepository _repository;

    public OrderController(ICustomerRepository repository)
    {
        _repository = repository;
    }
}

Tomando como base o código acima, tendo o AddTransient como forma de resolução, TODA VEZ que você o controlador for instânciado, será gerada uma nova instância do repositório.

Este cenário é ideal para quando queremos executar ações pontuais e já dispor o objeto, que normalmente é a maioria dos casos.

AddScoped

O AddScoped trabalha de forma parecida com o AddTransient porém ele retém o objeto durante toda a requisição, e sempre que invocado, retorna o mesmo objeto.

builder.Services.AddScoped<IDatabase, Database>();
builder.Services.AddTransient<ICustomerRepository, CustomerRepository>();
builder.Services.AddTransient<IProductRepository, ProductRepository>();

...

public class CustomerRepository : ICustomerRepository
{
    private readonly IDatabase _database;

    public CustomerRepository(IDatabase database)
    {
        _database = database;
    }
}

public class ProductRepository : IProductRepository
{
    private readonly IDatabase _database;

    public ProductRepository(IDatabase database)
    {
        _database = database;
    }
}

public class OrderController : Controller
{
    private readonly ICustomerRepository _customerRepository;
    private readonly IProductRepository _productRepository;

    public OrderController(
        ICustomerRepository customerRepository,
        IProductRepository productRepository)
    {
        _customerRepository = customerRepository;
        _productRepository = productRepository;
    }
}

Tomando como base o código acima, temos agora o CustomerRepository e ProductRepository no qual ambos dependem do Database.

A diferença é que o Database está sendo resolvido com AddScoped e os dois repositórios com AddTransient.

Isto nos diz que toda vez que o OrderController for instanciado, ele vai criar uma insância para CustomerRepository e outra para ProductRepository, mas apenas UMA INSTÂNCIA para o Database.

Uma vez que ele passe pelo construtor do CustomerRepository e resolva a dependência do Database, ele vai armazenar a instância na memória e toda requisição para Database retornará a mesma insância.

Isto termina no fim da requisição. Após enviar os dados para o client, o ASP.NET se encarrega de remover os objetos da memória.

Dominando Injeção de Dependência

Singleton

Antes de falar do AddSingleton precisamos entender que Singleton também é o nome de um padrão, que garante que um objeto tem uma e apenas uma instância para a aplicação como um todo.

Felizmente esta é a mesma definição do que o AddSingleton faz aqui no ASP.NET.

AddSingleton

O maior desafio no caso do AddSingleton é saber quando utilizá-lo, já que sempre teremos as mesmas informações (Mesma instância) do objeto para todos os usuários da aplicação.

Em um App Mobile ou Desktop, onde temos apenas um usuário ou até mesmo no Blazor WASM, isto não é um problema, mas na Web isto é diferente.

As aplicações ASP.NET ficam em constante execução, atendendo diferentes usuários, então muito cuidado ao utilizar o Singleton, já que os dados serão compartilhados entre todas as requisições.

builder.Services.AddSingleton<Configuration>();

...


public class OrderController : Controller
{
    private readonly Configuration _config;

    public OrderController(Configuration config)
    {
        _config = config;
    }
}

Um bom exemplo de uso são as configurações da aplicação (Desde que não sejam por usuário), que podem ser carregadas uma única vez no início da aplicação e reutilizada posteriormente.

Artigos Relacionados

  • Dependency Injection
  • ASP.NET Core Dependency Injection
  • Vídeo - DI

Populares

Priority Queue

Priority Queue ou fila prioritária é um tipo de lista inclusa no C# 10 que permite que seus itens...


Implicit Operators no C#

Implicit Operators permitem adicionar comportamentos de conversão a objetos Built In ou complexos...


ASP.NET 5 – Autenticação e Autorização com Bearer e JWT

Este artigo atualmente utiliza a versão 5.0.0-rc.1 do ASP.NET/.NET, o que significa que ainda não...


Clean Code - Guia e Exemplos

Saiba como manter seu código limpo (Clean Code) seguindo algumas práticas sugeridas pelo Robert C...


Git e GitHub - Instalação, Configuração e Primeiros Passos

Git é um sistema de controle de versões distribuídas, enquanto GitHub é uma plataforma que tem o ...


Compartilhe este artigo



Conheça o autor

André Baltieri

André Baltieri

Microsoft MVP

Me dedico ao desenvolvimento de software desde 2003, sendo minha maior especialidade o Desenvolvimento Web. Durante esta jornada pude trabalhar presencialmente aqui no Brasil e Estados Unidos, atender remotamente times da ?ndia, Inglaterra e Holanda, receber 8x Microsoft MVP e realizar diversas consultorias em empresas e projetos de todos os tamanhos.





2.438

Aulas disponíveis

235

horas de conteúdo

53.092

Alunos matriculados

36.728

Certificados emitidos





Comece de graça agora mesmo!

Temos mais de 18 cursos totalmente de graça e todos com certificado de conclusão.

Começar


Prefere algo mais Premium?

Conheça nossos planos



Premium semestral

Compra única, parcelada em até
12x no cartão de crédito


12x R$

41

,48

=R$ 497,80
  • 6 meses de acesso
  • Acesso à todo conteúdo
  • Emissão de Certificado
  • Tira Dúvidas Online
  • 54 cursos disponíveis
  • 4 carreiras disponíveis
  • 161 temas de tecnologia
  • Conteúdo novo todo mês
  • Encontros Premium

Começar agora

Política de privacidade

Premium anual

Compra única, parcelada em até
12x no cartão de crédito


12x R$

70

,65

=R$ 847,80
  • 1 ano de acesso
  • Acesso à todo conteúdo
  • Emissão de Certificado
  • Tira Dúvidas Online
  • 54 cursos disponíveis
  • 4 carreiras disponíveis
  • 161 temas de tecnologia
  • Conteúdo novo todo mês
  • Encontros Premium

Começar agora

Política de privacidade



Precisa de ajuda?

Dúvidas frequentes



  • Posso começar de graça?

    Sim! Basta criar sua conta gratuita no balta.io e começar seus estudos. Nós contamos com diversos cursos TOTALMENTE gratuitos e com certificado de conclusão.

  • Vou ter que pagar algo?

    Nós temos cursos gratuitos e pagos, porém você não precisa informar nenhum dado de pagamento para começar seus estudos gratuitamente conosco. Os cursos gratuitos são completos e com certificado de conclusão, você não paga nada por eles.

    Porém, caso queira algo mais Premium , você terá acesso à diversos benefícios que vão te ajudar ainda mais em sua carreira.

  • Por onde devo começar?

    Siga SEMPRE as nossas Carreiras , elas vão te orientar em todos os sentidos. Os cursos já estão organizados em categorias e carreiras para facilitar seu aprendizado.
    Nossa sugestão para aprendizado é começar pelo Backend e seguindo para Frontend e Mobile.

    • Backend
    • Frontend
    • Mobile

  • Os cursos ensinam tudo que preciso?

    Nenhum curso no mundo vai te ensinar tudo, desculpa ser sincero! Os cursos são uma base, eles fornecem por volta de 30% do que você precisa aprender, o resto é com você, com dedicação e MUITA prática.

  • O que eu devo estudar?

    Java ou .NET? Angular ou React? Xamarin ou Flutter? A resposta é simples e direta: "Você já sabe o básico?"

    Se você ainda não sabe BEM o básico, ou seja, os fundamentos, OOP, SOLID, Clean Code, está perdendo tempo estudando Frameworks ou até coisas mais avançadas como Docker. Foque nos seus objetivos primeiro.
    Agora se você está indeciso sobre qual Framework estudar, a boa notícia é que o mercado neste momento está bem aquecido e você tem várias oportunidade. Desta forma o que levaríamos em conta para tomar esta decisão seria:

    • Já sei o básico
    • O Framework/Tecnologia tem mercado onde eu estou (região)
    • O Framework/Tecnologia é utilizado em uma empresa onde quero atual
    • O Framework/Tecnologia resolve meu problema
    • Eu gosto de utilizar o Framework/Tecnologia

  • Estou pronto para estudar no balta.io?

    Com certeza! O primeiro passo é começar e você pode fazer isto agora mesmo!

    Começar de graça

Ainda tem dúvidas?





Assine nosso Newsletter

Receba em primeira mão todas as nossas novidades.

Cadastrar


balta.io

Sobre

  • Como funciona?
  • Seja Premium
  • Agenda
  • Blog
  • Todos os cursos

Cursos

  • Frontend
  • Backend
  • Mobile
  • Fullstack

Suporte

  • Termos de uso
  • Privacidade
  • Cancelamento
  • Central de ajuda

Redes Sociais

  • Telegram
  • Facebook
  • Instagram
  • YouTube
  • Twitch
  • LinkedIn
  • Discord