Inversão de dependência com NestJS
Luiz Pires
Posted on April 2, 2023
A inversão de dependência é um princípio importante da programação orientada a objetos, que consiste em tornar as classes independentes de outras classes específicas, e sim depender de interfaces genéricas. Isso permite uma maior flexibilidade e modularidade do código, além de facilitar o teste unitário e a manutenção.
No NestJS, é possível implementar a inversão de dependência através do uso de injeção de dependência. A injeção de dependência é um padrão de projeto que permite que as dependências de uma classe sejam fornecidas por uma fonte externa, como um contêiner de dependência.
Para implementar a injeção de dependência no NestJS, primeiro é necessário definir uma interface para a classe que será injetada. Por exemplo, se quisermos injetar uma classe UserService em outra classe, podemos definir uma interface IUserService que descreve os métodos que a classe UserService deve implementar.
export interface IUserService {
getUser(id: string): Promise<User>;
saveUser(user: User): Promise<void>;
}
Em seguida, é preciso criar uma classe concreta que implemente essa interface. Nesse caso, a classe UserService.
@Injectable()
export class UserService implements IUserService {
async getUser(id: string): Promise<User> {
// Lógica para buscar usuário no banco de dados
}
async saveUser(user: User): Promise<void> {
// Lógica para salvar usuário no banco de dados
}
}
Agora, para injetar essa classe em outra classe, basta usar o decorador @Inject() e especificar a interface que a classe implementa.
@Injectable()
export class UserApiController {
constructor(@Inject('IUserService') private readonly userService: IUserService) {}
async getUser(id: string): Promise<User> {
return this.userService.getUser(id);
}
async saveUser(user: User): Promise<void> {
return this.userService.saveUser(user);
}
}
Por fim, é preciso registrar a classe UserService no módulo do NestJS, utilizando o método forProvider() do módulo.
@Module({
providers: [
{ provide: 'IUserService', useClass: UserService }
],
controllers: [UserApiController],
})
export class UserModule {}
Dessa forma, a classe UserService será injetada automaticamente na classe UserApiController sempre que for necessário, sem que a classe dependa diretamente dela.
Posted on April 2, 2023
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.