Aplicando o Padrão Singleton no NestJS

Cláudio Rapôso
3 min readApr 26, 2023

Introdução

O NestJS é um framework avançado e escalável para a construção de aplicativos eficientes e confiáveis em Node.js. Ele usa o paradigma de programação orientada a objetos, facilitando a criação de aplicativos modulares e reutilizáveis. Um dos padrões de projeto mais comuns e úteis na programação orientada a objetos é o Singleton.

Neste artigo, mostraremos como aplicar o padrão Singleton no NestJS, garantindo que uma classe tenha apenas uma instância e fornecendo um ponto de acesso global a essa instância.

O que é o padrão Singleton?

O Singleton é um padrão de projeto que garante que uma classe tenha apenas uma instância única e fornece um ponto de acesso global a essa instância. Isso é útil quando precisamos de um recurso compartilhado em todo o aplicativo, como um gerenciador de configurações ou uma conexão com o banco de dados.

Implementando o Singleton no NestJS

Para ilustrar a implementação do padrão Singleton no NestJS, criaremos um serviço de gerenciamento de configurações. Esse serviço será responsável por carregar as configurações do aplicativo e fornecer acesso a essas configurações.

Passo 1. Crie um novo serviço:

nest generate service configuration

Passo 2. Implemente a classe ConfigurationService como um Singleton:

// configuration.service.ts
import { Injectable } from '@nestjs/common';

@Injectable()
export class ConfigurationService {
private static instance: ConfigurationService;
private readonly config: Record<string, any>;

private constructor() {
this.config = {
// Carregue suas configurações aqui
};
}

public static getInstance(): ConfigurationService {
if (!ConfigurationService.instance) {
ConfigurationService.instance = new ConfigurationService();
}

return ConfigurationService.instance;
}

public getConfig(key: string): any {
return this.config[key];
}
}

Neste exemplo, usamos uma variável estática instance para armazenar a instância única da classe ConfigurationService. O construtor é privado, garantindo que a classe só possa ser instanciada de dentro. A função pública getInstance() é usada para obter a instância única da classe, criando-a se ainda não existir.

Passo 3. Use o Singleton no seu aplicativo:

Agora que temos nosso serviço Singleton implementado, podemos usá-lo em outros módulos e componentes do aplicativo.

// app.module.ts
import { Module } from '@nestjs/common';
import { ConfigurationService } from './configuration/configuration.service';

@Module({
providers: [
{
provide: ConfigurationService,
useValue: ConfigurationService.getInstance(),
},
],
})
export class AppModule {}

// app.controller.ts
import { Controller, Get } from '@nestjs/common';
import { ConfigurationService } from './configuration/configuration.service';

@Controller()
export class AppController {
constructor(private readonly configService: ConfigurationService) {}

@Get('config')
getConfig(): Record<string, any> {
return this.configService.getConfig('exampleConfig');
}
}

Conclusão

Neste artigo, vimos como aplicar o padrão Singleton no NestJS de forma simples e eficaz. O padrão Singleton é uma excelente maneira de gerenciar instâncias únicas de serviços em sua aplicação, mantendo a estrutura de código organizada e escalável.

Lembre-se de que o NestJS é um framework poderoso que nos oferece várias ferramentas e recursos, e é importante escolher o padrão de design adequado para cada cenário específico. Com o conhecimento adquirido neste artigo, você está pronto para aplicar o padrão Singleton em suas aplicações NestJS e melhorar a qualidade do seu código.

--

--

Cláudio Rapôso

Microsoft MVP | Software Architect | Teacher | React | React Native | Node | Autor do Livro NestJS: Do Zero até a primeira API | MCT | 12x Msft | 2x AWS