DEV Community

Luiz Pires
Luiz Pires

Posted on • Updated on

Inversão de dependência com NestJS

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>;
}

Enter fullscreen mode Exit fullscreen mode

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
  }
}
Enter fullscreen mode Exit fullscreen mode

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);
  }
}
Enter fullscreen mode Exit fullscreen mode

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 {}

Enter fullscreen mode Exit fullscreen mode

Dessa forma, a classe UserService será injetada automaticamente na classe UserApiController sempre que for necessário, sem que a classe dependa diretamente dela.

Top comments (0)