2016-02-10 9 views
5

Ho un paio di domande su ambiti personalizzati:Ambito attività Dagger2, quanti moduli/componenti ho bisogno?

  1. sto usando MVP architecutre e ho bisogno di iniettare diversi relatori di diverse attività. A tale scopo ho creato @ActivityScope. Significa che devo creare un modulo/componente separato per ogni attività?
  2. Qual è lo scopo delle annotazioni dell'ambito personalizzato se sono ancora responsabile della creazione e del rilascio di tali dipendenze? Non sono sicuro se ho ragione, ma posso usare @ Scope123 in tutti i miei moduli/componenti e non farà alcuna differenza.
+0

Suppongo, sì, almeno sarà necessario un componente separato per ciascuna attività in cui si desidera utilizzare l'iniezione dall'ambito personalizzato. Se vuoi fare iniezioni dal tuo ambito globale che non è necessario. Per lo scopo: nel tuo ambito personalizzato puoi ad es. fornire una dipendenza all'attività senza creare una perdita di memoria. Ma sono d'accordo con te. Questo non è ancora chiaro per me. – Christopher

risposta

5

Vuol dire che devo creare un modulo/componente separato per ogni activitiy?

Sì. E no

Al meno è necessario creare un nuovo componente oggetto per ogni attività, se si desidera fornire attività di ambito dipendenze, come il Activity stesso, il LoaderManager, o cose simili, perché la portata sarà solo vivere fintanto che l'attività.

La questione di sapere se avete bisogno di un modulo e componenti per ogni singolo uno dei tuoi attività dipende fortemente dalla vostra architettura. Inoltre potresti essere in grado di creare un generico ActivityModule fornendo il modello, il presentatore e la vista che potresti riutilizzare.

Si potrebbe anche andare bene con un solo Component ad es. se sono necessari solo le dipendenze di base delle attività come la LoaderManager o Activity in sé allora si può scrivere un ActivityModule per fornire solo quegli oggetti di base. È quindi possibile utilizzare questo modulo con il proprio componente per fornire le dipendenze. Se il Presenter (e le sue dipendenze) possono essere creati dall'iniezione del costruttore si potrebbe andare bene con un singolo componente e modulo per tutte le vostre attività.

Se il presentatore e la vista sono le interfacce che vengono implementati si avrebbe bisogno di creare un modulo che prevede la realizzazione vera e propria, però.

Qual è lo scopo delle annotazioni di ambito personalizzato se sono ancora responsabile della creazione e del rilascio di tali dipendenze?

Scopes sono usati per fare la gestione di tali dipendenze più facile. Come accennato, l'ambito di attività muore con l'attività che viene distrutta. Avendo quelle dipendenze di ambito si può essere sicuri che nulla dipende dalla vostra attività che ha una portata/durata superiore e potrebbe causare perdite di memoria.

Inoltre, mi piace pensarlo come un insieme di dipendenze che puoi scambiare a caldo e semplicemente "buttare via". Un buon esempio è uno @UserScope che manterrà i dati utente, i suoi dati di sessione, sessione, ...
Se cambio utente, ho solo bisogno di buttare fuori tutto con un scope utente o meno (chiudi attività, rimuovi UserComponent) e tutto per quanto riguarda l'utente è andato. Il prossimo può effettuare il login e il rischio di effetti collaterali è basso.

Scopes sono per lo più di compilazione controlli orari che aiuto si mettono gerarchia nelle vostre dipendenze, dal momento che tutto il compilatore non è controllare che non ci siano cicli in esso e che nulla chiede le dipendenze da un ambito che non può accedere.

+0

Per la risposta, nella prima domanda intendevo diverse classi componente/modulo non istanze dello stesso ActivityModule. Ad esempio, in diverse attività, sono necessarie dipendenze diverse specifiche per tale attività (presentatore stesso e casi di utilizzo/interattività che verranno utilizzati solo in tale attività). Quindi la mia domanda riguarda più gli standard: le persone mettono tutte le dipendenze in una classe ActivityModule e le usano ovunque iniettando solo le dipendenze richieste o le separano in moduli diversi. – user1049280

+0

@ user1049280 Questo è quello che stavo cercando di dire. È possibile riutilizzare alcuni moduli e si può andare molto lontano usando solo l'iniezione di un constuctor. Ma non appena avrai bisogno di classi specifiche per attività specifiche, * dovrai * rendere un componente/ambito aggiuntivo per quelle –

+0

molte grazie ora è chiaro! – user1049280

1
  1. Il modo più semplice per fare ciò che serve è quello di creare un componente livello di applicazione nel desiderio di fornire ogni tipo di presentatore. Il problema è che avrai tutte le classi di tutti i progetti allo stesso livello, che è un po 'brutto. Il bel modo è quello di creare un modulo per un'attività che inietta le dipendenze per l'attuale attività/frammento

  2. Utilizzando @ActivityScope o qualsiasi altro solo mostrare il modulo ha una durata diversa da @Singleton, fintanto che è non un singleton, considera che il tuo modulo morirà come la tua attività che lo ha creato.