Skip to content

Instantly share code, notes, and snippets.

@nathy-mesquita
Last active February 18, 2024 22:07
Show Gist options
  • Save nathy-mesquita/afc55dfb32529ddcc37e68ca781c0dc2 to your computer and use it in GitHub Desktop.
Save nathy-mesquita/afc55dfb32529ddcc37e68ca781c0dc2 to your computer and use it in GitHub Desktop.
Conhecendo a Injeção de Dependência

Injeção de Dependência

O que é?

Uma técnica que permite a inserção de um objeto em outro, geralmente através do construtor, criando a relação de dependência.

O método que utilizamos para adicionar configurações para o Controller é um exemplo de injeção de Dependência.

Técnica muito utilizada para melhorar a qualidade de código em refatorações, e torná-lo mais testável.

Injeção de dependência trata os problemas da seguinte maneira:

  • O uso de uma interface ou classe base para abstrair a implementação da dependência.
  • Registrando a dependência em um contêiner de serviço. O ASP.NET Core fornece um contêiner de serviço interno, o IServiceProvider. Normalmente, os serviços são registrados no método do Startup. ConfigureServices aplicativo.
  • Injeção do serviço no construtor da classe na qual ele é usado. A estrutura assume a responsabilidade de criar uma instância da dependência e de descartá-la quando não for mais necessária.

Ciclo de vida do objeto!

  • Singleton: uma instância por aplicação;
  • Scoped: uma instância por requisição;
  • Transient: uma instância por classe;

@nathy-mesquita
Copy link
Author

Demo

Criamos uma classe para exemplificar o comportamento ExampleClass

public class ExampleClass
    {
        public string Name { get; set; }
    }

No construtor das Controllers passamos no contrutor a classe criada:

ProjectsController

[Route("api/[controller]")]
public class ProjectsController : ControllerBase
{
    private readonly OpeningTimeOption _option;

    public ProjectsController(IOptions<OpeningTimeOption> option, ExampleClass exampleClass)
    {
        exampleClass.Name = "Updated at ProjectsController";
        _option = option.Value;
    }

	[...]
}

UsersController

[Route("api/[controller]")]
public class UsersController : ControllerBase
{
    public UsersController(ExampleClass exampleClass)
    {
        exampleClass.Name = "Updated at UserController";
    }
	
	[...]
}

@nathy-mesquita
Copy link
Author

Startup

AddSingleton: Instância para toda aplicação enquanto ela estiver inicializada.

public void ConfigureServices(IServiceCollection services)
{
    services.AddSingleton<ExampleClass>(e => new ExampleClass { Name = "Initial Stage" });
	[...]
}

Executando a aplicação

Foi colocado um breakpoint no construtor de cada controladora.

Ao executar um método da controladora de Projects, obtivemos o seguinte comportamento:

image

Ou seja, a propriedade "Name" já veio com o nome definido na Statup.

Em seguida, executamos um método da controladora Users, obtivemos o seguinte comportamento:

image

O objeto teve duas requisições diferentes e foi alterado entre elas, por conta do padrão Singleton.

Por ser um Singleton é uma instância para toda aplicação enquanto ela estiver inicializada.

@nathy-mesquita
Copy link
Author

nathy-mesquita commented Jun 30, 2021

Utilizando o AddScoped Instância para toda requisição

Startup

public void ConfigureServices(IServiceCollection services)
{
    services.AddScoped<ExampleClass>(e => new ExampleClass { Name = "Initial Stage Scoped" });
	[...]
}

Executando a aplicação

ProjectsController

image

UsersController

image

Isso mostra que o tempo de vida dele é apenas por requisições.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment