2013-07-03 2 views
18

Lorsque vous utilisez Dagger, je trouve que je reçois plusieurs instances d'un singleton quand je l'injectent partout où je besoin. J'ai annoté la classe et la méthode provides avec @Singleton. Quelqu'un peut-il penser à pourquoi cela se passe-t-il?singletons dans 1.x Dagger

Edit:

Si elle aide, j'ai suivi la même structure pour mon application comme l'exemple d'application dans GitHub Dague (https://github.com/square/dagger/tree/master/examples/android-activity-graphs). J'essaie d'obtenir le Singleton dans l'activité de base et un couple de classes de tiers fournis en utilisant @Provides à la classe personnalisée Application. Est-ce parce que je suis en train d'ajouter des modules à chaque activité au graphe d'objet original?

(PS: Je suis nouveau à Dagger et DI en général, donc je serai reconnaissant si vous pouviez fournir une explication pour que je puisse apprendre Merci..)

Répondre

39

@Singleton, dans 1.x Dagger , agit différemment de ce que vous pourriez penser. La définition de la spécification JSR-330 dans le @Singleton javadoc est « un par graphique » et comment Dagger interprète. Donc, si vous avez quelque chose marqué @Singleton, et qu'il est matérialisé dans votre graphe applicatif (par opposition à un graphe à durée de vie plus courte), vous obtenez une instance par application. Si vous avez un élément annoté @Singleton dans les modules que vous utilisez pour configurer votre graphique d'activité (c'est-à-dire, qui est obtenu à partir de la partie d'un graphique spécifiée par un module utilisé dans l'opération plus()), vous obtiendrez un-par-activité-graphique.

Si vous avez besoin de quoi être une fois par application, vous devez vous assurer qu'il est créé comme une partie du graphique de l'application. Vous pouvez le faire de deux façons. Vous pouvez soit lui fournir explicitement une méthode @Provides à partir de votre module d'application, soit la répertorier comme l'une des classes de @Module (injects = ...) dans un module d'application.

(Si vous ne marquez pas avec @Singleton que vous obtiendrez un par site d'injection.)

Alors rappelez-vous, le graphique créé par plus() est considéré comme un graphique distinct qui pointe vers le graphique à partir de laquelle il a été engendré, et l'enveloppe, peut accéder à des instances à l'intérieur, mais ce n'est pas le même graphique.

Remarque - 2.x Dagger améliore cela, et prend en charge les annotations de cadrage sur mesure, bien que le mécanisme est similaire, avec un graphique (composante) par annotation portée, avec une relation parent/enfant entre les graphiques de durées de vie plus larges/étroites

+0

Merci pour le nettoyage cela. Quand vous dites spec, faites-vous référence à JSR330? – Raghuveer

+0

Oui. Désolé - Je vais modifier la réponse. –

+0

@ChristianGruber Comment cela s'applique-t-il aux Constructeurs injectés Singleton utilisés dans divers sous-graphes d'un graphique parent? Est-ce que cela signifie un par graphique dans lequel la classe est utilisée, sauf si elle existe déjà dans un graphique parent? – vinc3m1