Dependency Injector ou injeção de dependência

images

Olá pessoal, meu nome é Mauricio Junior e hoje eu vou falar um pouco sobre Dependency Injector usando .NET Core e a linguagem C# da Microsoft. Você pode usar qualquer ferramenta mas eu usei esses aqui:

  • Ferramenta: Visual Studio
  • Linguagem: C#
  • Framework: .NETCore ou .NET 6

Explicando

Antigamente n√≥s precis√°vamos criar inst√Ęncias como Class class = new Class() para acessar os m√©todos dentro da inst√Ęncia gerada como class.Method(parameter) mas agora a praticidade √© melhor e o sistema sabe gerenciar as inst√Ęncias necess√°rias; e por isso agora voc√™ pode deixar preparado no sistema web, api ou desktop vari√°veis que v√£o ter a possibilidade de uso atrav√©s do construtor e caso ela n√£o seja usada, nenhum endere√ßo de mem√≥ria ser√° criado, √© criado apenas no momento de uso e √© reutilizado caso use mais de uma vez.

Antigamente n√≥s tinhamos sistemas que geravam inst√Ęncias new Class() que acabavam n√£o sendo usadas e assim consumindo mem√≥ria no servidor de forma desnecess√°ria.

Como fazer?

Com o .NET Core e .NET 6, podemos usar dependency injector através da configuração do sistema e confirmando o uso através do construtor da classe. Eu quero dizer que, no momento que quiser acessar algum método da classe, basta usar o nome da variável colocada no construtor e acessar o método disponível.

√Č necess√°rio ter uma interface da classe sempre.

Vamos para o código?

Na configuração do sistema você pode usar o AddScoped, o Singleton e o Transient por exemplo. Vou explicar de forma simples cada um deles:

  • AddScoped: os objetos s√£o os mesmos para cada objeto e para cada requisi√ß√£o
  • Singleton: os objetos s√£o os mesmos dentro da mesma requisi√ß√£o e s√£o diferentes em diferentes chamadas
  • Transient: os objetos s√£o sempre diferentes, e uma nova inst√Ęncia √© criada para todo o controlador e todo servi√ßo.

Você escolhe baseado no que for melhor para você.

Dentro da classe Startup.cs do projeto, existe o método ConfigureServices(IServiceCollection services) e é aqui que vou adicionar as classes no meu escopo. Veja o código 1.1

Código 1.1 - Adicionando classe ao escopo

public void ConfigureServices(IServiceCollection services)
{
    services.AddScoped<IClassService, ClasseService>();
}

Eu adicionei aqui uma classe de serviço chamada ClassService mas eu posso colocar outras classes também como demonstro no código 1.2.

Código 1.2 - Adicionando várias classes no escopo

public void ConfigureServices(IServiceCollection services)
{
    //add services
    services.AddScoped<IUserService, UserService>();
    services.AddScoped<IUserTypeService, UserTypeService>();

    //add repository
    services.AddScoped<IUserRepository, UserRepository>();
    services.AddScoped<IUserTypeRepository, UserTypeRepository>();
}

No c√≥digo 1.2 eu j√° mostro quatro classes diferentes adicionadas no escopo e que podem ser usadas em qualquer momento no c√≥digo. Uma inst√Ęncia ser√° criada apenas quando o construtor da classe implementar. Vamos para o construtor?

Construtor da uma classe

Código 1.3 - Construtor da classe

public class UserController : ControllerBase 
{
    //vari√°vel privada
    private readonly IUserService _userService;

    //construtor
    public UserController(IUserService userService)}
    {
        _userService = userService;
    }
}

Note que no código 1.3 eu adicionei uma variável privada com o nome da Interface adicionada no escopo, a IUserService. No construtor do método que é o nome da classe, eu adicionei uma variável e fiz a atribuição.

Para os próximos métodos, basta colocar o nome da variável e chamar os métodos disponíveis através dela, veja o código 1.4 de exemplo.

Código 1.4 - Chamando métodos.

public ActionResult<List<UserModel>> GetAllUsers()
{
    return _userService.GetAll();
}

Note que no c√≥digo 1.4 eu criei um m√©todo que retorna uma lista de usu√°rios e para chamar o m√©todo respons√°vel n√£o foi necess√°rio criar uma inst√Ęncia para acessar o m√©todo GetAll().

Espero que tenha gostado e qualquer d√ļvida pode entrar em contato comigo pelo site Mauricio Junior - www.mauriciojunior.net.