Ho letto molto sul pattern di singleton e su come è "cattivo" perché rende le classi difficili da testare, quindi dovrebbe essere evitato. Ho letto alcuni articoli che spiegano come il singleton possa essere sostituito con l'iniezione di dipendenza, ma mi sembra inutilmente complesso.
Ecco il mio problema in modo un po 'più dettagliato. Sto creando un'app mobile utilizzando React Native e voglio creare un client REST che comunichi con il server, recuperi dati, carichi i dati e gestisca l'accesso (memorizza il token di accesso e invialo a ogni richiesta dopo l'accesso).
Il mio piano iniziale era di creare un oggetto singleton (RESTClient) che la mia app usasse inizialmente per accedere e quindi fare richiesta inviando le credenziali dove necessario. L'approccio di DI sembra davvero complicato per me (forse perché non ho mai usato DI prima) ma sto usando questo progetto per imparare il più possibile, quindi voglio fare il meglio qui. Qualsiasi suggerimento e commento sono molto apprezzati.
Modifica: Ora ho realizzato che ho formulato la mia domanda in modo insufficiente. Volevo delle indicazioni su come evitare il pattern singleton in RN e dovrei farlo anche io. Fortunatamente Samuel mi ha dato il tipo di risposta che volevo. Il mio problema era che volevo evitare il pattern singleton e usare DI, ma sembrava davvero complicato implementarlo in React Native. Ho fatto ulteriori ricerche e l'ho implementato usando il sistema di contesto Reacts.
Per chiunque sia interessato ecco come l'ho fatto. Come ho detto, ho usato il contesto in RN che è qualcosa di simile a oggetti di scena ma è propagato a ogni componente.
Nel componente root fornisco le dipendenze necessarie come questa:
export default class Root extends Component {
getChildContext() {
restClient: new MyRestClient();
}
render() {...}
}
Root.childContextTypes = {restClient: PropTypes.object};
Ora restClient è disponibile in tutti i componenti di seguito Root. Posso accedervi in questo modo.
export default class Child extends Component {
useRestClient() {
this.context.restClient.getData(...);
}
render() {...}
}
Child.contextTypes = {restClient: PropTypes.object}
Questo sposta efficacemente la creazione dell'oggetto dalla logica e disaccoppia l'implementazione del client REST dai miei componenti.