Возможно, вы захотите рассмотреть возможность использования Multibindings, который позволяет пользователям дополнительно добавлять зависимости в Set<T>
или Map<K,V>
. Вот пример:
interface Plugin {
void install(Application application);
}
@Component({ModuleA.class, ModuleB.class})
interface PluginComponent {
Set<Plugin> plugins();
}
@Module
class ModuleA {
@Provides(type = SET) Plugin providFooPlugin() {
return new FooPlugin();
}
}
@Module
class ModuleB {
@Provides(type = SET) Plugin providBarPlugin() {
return new BarPlugin();
}
}
В этом случае вам по-прежнему нужен экземпляр каждого модуля, даже если он не используется. Один из вариантов обойти это - использовать @Provides(type = SET_VALUES)
и иметь модули, которые вы не отключили, чтобы вернуть Collections.emptySet()
. Вот модифицированный пример:
interface Plugin {
void install(Application application);
}
@Component({ModuleA.class, ModuleB.class})
interface PluginComponent {
Set<Plugin> plugins();
}
@Module
class ModuleA {
private final Set<Plugin> plugins;
ModuleA(Set<Plugin> plugins) {
this.plugins = plugins;
}
@Provides(type = SET_VALUES) Plugin providFooPlugins() {
return plugins;
}
}
@Module
class ModuleB {
@Provides(type = SET) Plugin providBarPlugin() {
return new BarPlugin();
}
}
Теперь вы можете позвонить:
DaggerPluginComponent.builder()
.moduleA(new ModuleA(Collections.emptySet())
.build();
или в качестве альтернативы:
Set<Plugin> plugins = new HashSet<>();
plugins.add(new AwesomePlugin());
plugins.add(new BoringPlugin());
DaggerPluginComponent.builder()
.moduleA(new ModuleA(plugins)
.build();
параметризованных модулям должны быть установлены вручную, в то время как не-параметризованные модули автоматически создаются если не предоставлено через строителя. Вам, вероятно, потребуется какой-то заводский метод для предоставления «пустых модулей», если они не существуют. Но, возможно, вы можете настроить это поведение с помощью аннотации '@ Component.Builder', которая была добавлена в последний моментальный снимок. – EpicPandaForce
Невозможно ли пропустить полное создание модуля? Я также увижу упомянутую вами аннотацию. Использование пустых конструкторов. – razzledazzle