Comment pouvez-vous remplacer les dépendances dans différentes portées de Dagger 2? Exemple:Comment remplacer les dépendances dans Scopes in Dagger 2
J'ai deux composants dans mon application: ApplicationComponent
et ActivityComponent
. ApplicationComponent
est le composant de base et ActivityComponent
est un composant sectoriel dans lequel je souhaite effectuer le remplacement.
Pour cet exemple, je créé ces modèles:
public class Parrot {
private final HelloPrinter helloPrinter;
public Parrot(HelloPrinter helloPrinter) {
this.helloPrinter = helloPrinter;
}
public void sayHello(){
helloPrinter.print();
}
}
public interface HelloPrinter {
void print();
}
public class AppHelloPrinter implements HelloPrinter{
@Override
public void print() {
System.out.println("Hello Application");
}
}
public class ActivityHelloPrinter implements HelloPrinter {
@Override
public void print() {
System.out.println("Hello Activity");
}
}
Et le code:
ApplicationComponent applicationComponent = DaggerApplicationComponent.builder().build();
applicationComponent.provideParrot().sayHello();
activityComponent = DaggerActivityComponent.builder()
.applicationComponent(applicationComponent).build();
activityComponent.provideParrot().sayHello();
Ma sortie désirée est:
Hello Application
Hello Activity
Je fait les modules:
ApplicationModule:
@Singleton
@Component(modules = ApplicationModule.class)
public interface ApplicationComponent {
Parrot provideParrot();
}
@Module
public class ApplicationModule {
@Provides
@Singleton
HelloPrinter providePrinter(){
return new AppHelloPrinter();
}
@Provides
Parrot provideParrot(HelloPrinter helloPrinter) {
return new Parrot(helloPrinter);
}
}
ActivityModule: tente de remplacer le HelloPrinter
@PerActivity
@Component(dependencies = ApplicationComponent.class, modules = ActivityModule.class)
public interface ActivityComponent {
Parrot provideParrot();
}
@Module
@PerActivity
public class ActivityModule {
@Provides
@PerActivity
HelloPrinter provideHelloPrinter() {
return new ActivityHelloPrinter();
}
}
Mais avec cette config la sortie est:
Hello Application
Hello Application
Qu'est-ce que je fais mal? Merci
Je pense qu'il n'est pas possible de remplacer le module dans Dagger2. Si cela vous convient, vous pouvez essayer de les marquer comme @Named ("Activité") et @Named ("Application") –