2017-02-10 6 views
1

Also, was ich versuche zu erreichen, ist sicherzustellen, dass ich nur eine Instanz pro Bereich in Dagger2 habe.Sicherstellen nur einer Instanz pro Bereich in Dagger2

Der Standard-Singleton-Bereich funktioniert bereits auf diese Weise. Egal wie viele Stellen Sie dasselbe Objekt injizieren, nennen wir es GlobalInstance, Methode GlobalInstance provideGlobalInstance(), die es einmal und nur einmal aufrufen wird.

Auf der anderen Seite, wenn ich benutzerdefinierten Bereich definieren, zum Beispiel @SessionScope und innerhalb einiger SessionModule Ich mache Methode User provideUser(), dass Verfahren (und folgerichtig, new User() Konstruktor) wird so oft aufgerufen werden, wie ich bin User injiziert wird. Egal, ob ich jedes Mal die gleiche Modulinstanz verwende, User provideUser() wird für jede @Inject User mUser aufgerufen, die ich in meinem Code, resultierend mit mehreren Instanzen, anstelle eines Scope-limitierten "Singleton" habe.

Gibt es einen klaren Weg, um es zu erreichen, mit regulären Dagger api. Eine Möglichkeit, dies zu tun, ist, faule Getter innerhalb der Modulklasse zu haben, aber es ist keine sehr saubere Art, dies zu tun.

+0

Sie sollten die gleichen Komponenten verwenden, um sicherzustellen, dass Sie die Instanz injizieren, die – EpicPandaForce

+0

Ok an die angegebene Komponente gehört, so sollte stattdessen ein Modul von persistierenden, ich anhalten irgendwie ganze Komponente, oder? Was ist die beste Vorgehensweise dafür? Einige statische/globale Komponenten cachen? – SadClown

+0

Ja, normalerweise ja. Ich habe 'static' für den Gültigkeitsbereich @Singleton und' onRetainCustomNonConfigurationInstance() 'für Aktivität gesehen. 'Map ' sonst, wo sie die Komponente zu einem Schlüssel in der Karte speichern – EpicPandaForce

Antwort

1

Bitte beachten Sie, dass der Bereich @Singleton funktionell einem anderen von Ihnen definierten benutzerdefinierten Bereich entspricht.

Es bedeutet, dass Sie zwei Arten von @Provides Methoden in SessionModule haben könnte:

  • @Provides @SessionsScope - bietet "Session Singletons" (mehr dazu später)
  • @Provides - stellt neues Objekt auf jeder Injektion

Bitte beachten Sie, dass der Begriff "Singleton" einige Unklarheiten hat, wenn wir über Dolch sprechen, daher bevorzuge ich den Begriff "Zielobjekte". Wenn das Zielobjekt zum ersten Mal mit Dolch injiziert wird, speichert die Komponente ihre Instanz zwischen und speichert sie bei jeder nachfolgenden Injektion, die von der gleichen Komponente ausgeführt wird.

Für Sie diesen Beitrag mehr Informationen lesen können: Android Dagger 2 Scopes Demistified

+0

Ich nahm an, dass benutzerdefinierte Bereiche nicht anders als bereitgestellten Singleton, aber, wie ich beschrieben, ich habe ein anderes Verhalten. Es scheint, dass das Problem ist, was EpicPandaForce im Kommentar erklärt hat - ich sollte nicht nur das gleiche Modul sondern ganze Komponente verwenden, wenn ich nicht will, dass *() -Methoden mehr als einmal pro Bereich aufgerufen werden. – SadClown

+0

@SadClown, bitte lesen Sie den Blogbeitrag, auf den ich verwiesen habe - er erklärt diese Beziehungen im Detail. Es gibt auch eine Tutorial-App auf Github, die einen möglichen Ansatz zur Handhabung von Komponenten zeigt. – Vasiliy

+0

Sorry, wenn ich unhöflich aussehe, aber ich ging durch die Post und habe meine Antwort nicht gefunden. Aber ich habe mein Problem gelöst und die Antwort von EpicPandaForce kombiniert. Vielen Dank. – SadClown

Verwandte Themen