Probabilmente mi sono perso qualcosa, ma pensavo che Scopes come @Singleton venissero usati per definire "cicli di vita circoscritti".Scopes in Dagger 2
Uso Dagger 2 in un'app Android (ma non penso che il problema riguardi Android).
Ho 1 Modulo:
@Module public class MailModule {
@Singleton @Provides public AccountManager providesAccountManager() {
return new AccountManager();
}
@Singleton @Provides public MailProvider providesMailProvider(AccountManager accountManager) {
return new MailProvider(accountManager);
}
}
Ho due componenti differenti con @Singleton
portata:
@Singleton
@Component(modules = MailModule.class)
public interface LoginComponent {
public LoginPresenter presenter();
}
@Singleton
@Component(
modules = MailModule.class
)
public interface MenuComponent {
MenuPresenter presenter();
}
Sia, MenuPresenter
e LoginPresenter
, hanno un costruttore @Inject
. Mentre si aspetta MenuPresenter MailProvider
come parametro, LoginPresenter prende un AccountManager
:
@Inject public MenuPresenter(MailProvider mailProvider) { ... }
@Inject public LoginPresenter(AccountManager accountManager) { ... }
Ma ogni volta che utilizzare i componenti per creare un MenuPresenter
o LoginPresenter
ottengo una nuova istanza fresco di MailProvider
e AccountManager
. Pensavo che fossero nello stesso scopo e dovessero quindi essere una specie di singleton (nello stesso scopo).
Ho capito qualcosa di completamente sbagliato. Come posso definire un vero singleton per più componenti in Dagger 2?
Ma un componente può avere solo un'annotazione Scope, giusto? Come dovrei farlo se ho un componente dell'applicazione con '@ Application' e LoginComponent con l'ambito' @ Activity'? – sockeqwe
Giusto. Il componente non può essere annotato con due ambiti. Il componente dell'ambito di attività avrebbe tutte le dipendenze dal componente dell'ambito dell'applicazione se è definito nell'annotazione '@Component (dependencies = ApplicationComponent.class)'. Pensa a componenti con ambiti come grafici e sottografi. Componente dell'applicazione e relativo ambito: grafico root, componente attività e relativo ambito: sottografo di root. –
Evitare l'uso dell'ambito '' '@ Singleton''' permette di inserire le dipendenze' '' @ Application''' in '' '@ Activity''' scope? L'esempio sarebbe, se MyPresenter è di scope '' '@ Application''' e voglio iniettarlo in MyActivity che è di scope' '' @ Activity'''. – AAverin