2013-07-03 16 views
18

Quando uso Dagger, ho scoperto che sto ricevendo più istanze di un singleton quando lo inserisco ovunque ne abbia bisogno. Ho annotato la classe e il metodo fornisce con @Singleton. Qualcuno può pensare perché questo sta accadendo?Singletons in Dagger 1.x

Edit:

Se aiuta, ho seguito la stessa struttura per la mia app, come l'applicazione di esempio in GitHub di Dagger (https://github.com/square/dagger/tree/master/examples/android-activity-graphs). Sto cercando di ottenere Singleton nell'attività di base e un paio di classi di terze parti fornite utilizzando @Provides nella classe personalizzata Application. È perché sto aggiungendo moduli per ogni attività al grafico dell'oggetto originale?

(PS: Sono nuovo di Dagger e DI, in generale, così sarò grato se potesse fornire una spiegazione in modo che io possa imparare Grazie..)

risposta

39

@Singleton, in Dagger 1.x , agisce in modo diverso da come potresti pensare. La definizione della specifica JSR-330 nel javadoc @Singleton è "una per grafico" ed è così che interpreta Dagger.

Quindi, se si dispone di qualcosa contrassegnato come @Singleton e si materializza nel grafico dell'applicazione (diversamente da un grafico di durata inferiore), si ottiene un'istanza per applicazione.

Se si dispone di un elemento annotato @Singleton che è nei moduli da utilizzare per configurare il grafico di attività (ad esempio, che si ottiene dalla parte di un grafico specificato da un modulo utilizzato nell'operazione più()), allora si otterrà uno-per-activity-grafico.

Se avete bisogno di qualcosa per essere una volta per applicazione, è necessario assicurarsi che venga creato come parte del grafico dell'applicazione. Puoi farlo in due modi. O fornite esplicitamente un metodo @Provides dai vostri moduli di applicazione, oppure potete elencarlo come una delle classi in @Module (injects = ...) in un modulo dell'applicazione.

(Se non si segna con @Singleton di quanto si otterrà uno per ogni sito di iniezione.)

Quindi ricordate, il grafico creato da più() è visto come un grafico separato che punta al grafico da cui è stato generato e lo avvolge, può accedere alle istanze al suo interno, ma non è lo stesso grafico.

Note - Dagger 2.x migliora questo, e sostiene le annotazioni di ambito personalizzato, anche se il meccanismo è simile, con un grafico (componente) per ambito annotazione, con una relazione padre/figlio tra i grafici delle più ampie/vite strette

+0

Grazie per averlo chiarito. Quando dici spec, ti riferisci a JSR330? – Raghuveer

+0

Sì. Spiacente, modificherò la risposta. –

+0

@ChristianGruber Come si applica a Costruttori iniettati singleton utilizzati in vari sottogrammi di un grafico padre? Significa un grafico per riga in cui viene utilizzata la classe, tranne quando esiste già in un grafico padre? – vinc3m1