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.