Eu tenho lido muito sobre o padrão singleton e como ele é "ruim", porque dificulta o teste das classes, por isso deve ser evitado. Eu li alguns artigos explicando como o singleton poderia ser substituído pela injeção de dependência, mas parece desnecessariamente complexo para mim.
Aqui está o meu problema com mais detalhes. Estou construindo um aplicativo móvel usando o React Native e quero criar um cliente REST que se comunique com o servidor, obtenha dados, publique dados e lide com o logon (armazene o token de logon e envie-o a cada solicitação após o logon).
Meu plano inicial era criar um objeto singleton (RESTClient) que meu aplicativo usaria inicialmente para efetuar login e, em seguida, fazer o pedido enviando as credenciais quando necessário. A abordagem de DI parece realmente complicada para mim (talvez porque nunca usei DI antes), mas estou usando esse projeto para aprender o máximo possível, para que eu queira fazer o melhor aqui. Todas as sugestões e comentários são muito apreciados.
Edit: Agora eu percebi que tenho formulado minha pergunta mal. Eu queria algumas orientações sobre como evitar o padrão singleton no RN e devo fazê-lo. Felizmente, Samuel me deu o tipo de resposta que eu queria. Meu problema era que eu queria evitar o padrão singleton e usar o DI, mas parecia realmente complicado implementá-lo no React Native. Eu fiz algumas pesquisas adicionais e a implementei usando o sistema de contexto Reacts.
Para quem estiver interessado, aqui está como eu fiz. Como eu disse, usei o contexto no RN, que é algo como adereços, mas é propagado para todos os componentes.
No componente raiz, forneço as dependências necessárias como esta:
export default class Root extends Component {
getChildContext() {
restClient: new MyRestClient();
}
render() {...}
}
Root.childContextTypes = {restClient: PropTypes.object};
Agora restClient está disponível em todos os componentes abaixo de Root. Eu posso acessá-lo assim.
export default class Child extends Component {
useRestClient() {
this.context.restClient.getData(...);
}
render() {...}
}
Child.contextTypes = {restClient: PropTypes.object}
Isso efetivamente afasta a criação de objetos da lógica e desacopla a implementação do cliente REST dos meus componentes.