Чтобы изучить Dagger 2, я решил переписать свое приложение, но я застрял в поиске правильного решения для следующей проблемы.Кинжал 2: как изменить предоставленные зависимости во время выполнения
Для целей данного примера давайте предположим, что у нас есть интерфейс, который называется Mode
:
public interface Mode {
Object1 obj1();
//some other methods providing objects for app
}
и две реализации: NormalMode
и DemoMode
.
Режим хранится в одноэлементном режиме, поэтому он может быть доступен из любого места приложения.
public enum ModeManager {
INSTANCE,;
private Mode mode;
public Mode mode() {
if (mode == null)
mode = new NormalMode();
return mode;
}
public void mode(Mode mode) { //to switch modules at runtime
this.mode = mode;
}
}
NormalMode
переключается на DemoMode
во время выполнения (скажем, когда пользователь clickcs на фоне пару раз)
public void backgroundClicked5Times(){
ModeManager.INSTANCE.mode(new DemoMode());
//from now on every object that uses Mode will get Demo implementations, great!
}
Так первый я избавилась от одноточечного и определенного режима, которые Кинжалы 2:
@Module
public class NormalModeModule {
@Provides
public Object1 provideObject1() {
return new NormalObject1();
}
}
@Module
public class DemoModeModule {
@Provides
public Object1 provideObject1() {
return new DemoObject1();
}
}
Теперь в способе backgroundClicked5Times
в вместо того, чтобы иметь дело с singleton, я хотел бы заменить NormalModeModule
на DemoModeModule
в DAG, чтобы другие классы, которые нуждались в Object1
, с этого момента получили бы реализацию DemoObject1
.
Как я могу это сделать в кинжале?
Заранее спасибо.
Возможного дубликат [модули Swappable с кинжалом 2] (https://stackoverflow.com/questions/35658488/swappable-modules-with-dagger-2) – tir38