Ich habe viel über das Singleton-Muster gelesen und wie es "schlecht" ist, weil es die Klassen, die es verwenden, schwer zu testen macht, so dass es vermieden werden sollte. Ich habe einige Artikel gelesen, in denen erklärt wird, wie der Singleton durch Abhängigkeitsinjektion ersetzt werden kann, aber er erscheint mir unnötig komplex.
Hier ist mein Problem etwas detaillierter. Ich erstelle eine mobile App mit React Native und möchte einen REST-Client erstellen, der mit dem Server kommuniziert, Daten abruft, Daten veröffentlicht und die Anmeldung verarbeitet (speichern Sie das Anmeldetoken und senden Sie es bei jeder Anforderung nach der Anmeldung).
Mein ursprünglicher Plan war es, ein Singleton-Objekt (RESTClient) zu erstellen, mit dem sich meine App zunächst anmeldet und dann bei Bedarf die Anmeldeinformationen sendet. Der DI-Ansatz scheint mir wirklich kompliziert zu sein (vielleicht, weil ich DI noch nie zuvor verwendet habe), aber ich verwende dieses Projekt, um so viel wie möglich zu lernen, damit ich hier das Beste tun möchte. Anregungen und Kommentare werden sehr geschätzt.
Bearbeiten: Ich habe jetzt festgestellt, dass ich meine Frage schlecht formuliert habe. Ich wollte eine Anleitung, wie man das Singleton-Muster in RN vermeidet und sollte ich es überhaupt tun. Zum Glück gab mir Samuel genau die Antwort, die ich wollte. Mein Problem war, dass ich das Singleton-Muster vermeiden und DI verwenden wollte, aber es schien wirklich kompliziert, es in React Native zu implementieren. Ich habe weitere Nachforschungen angestellt und es mit dem Reacts-Kontextsystem implementiert.
Für alle Interessierten hier ist, wie ich es gemacht habe. Wie gesagt, ich habe den Kontext in RN verwendet, der so etwas wie Requisiten ist, aber auf jede Komponente übertragen wird.
In der Root-Komponente stelle ich die erforderlichen Abhängigkeiten wie folgt bereit:
export default class Root extends Component {
getChildContext() {
restClient: new MyRestClient();
}
render() {...}
}
Root.childContextTypes = {restClient: PropTypes.object};
Jetzt ist restClient in allen Komponenten unter Root verfügbar. Ich kann so darauf zugreifen.
export default class Child extends Component {
useRestClient() {
this.context.restClient.getData(...);
}
render() {...}
}
Child.contextTypes = {restClient: PropTypes.object}
Dadurch wird die Objekterstellung effektiv von der Logik entfernt und die REST-Client-Implementierung von meinen Komponenten entkoppelt.