Сменные модули с Dagger 2
Итак, у меня есть код, который запускает алгоритм, скажем, с классом AlgoRunner. Теперь этот класс AlgoRunner может быть реализован несколькими способами для запуска различных алгоритмов с использованием классов Algo. Я хочу использовать Dagger 2 для предоставления различных реализаций класса AlgoRunner классу «Manager», который передает входные данные в AlgoRunner, а также в другие компоненты, которыми он управляет.
Вопрос
У меня есть следующее прямо сейчас, но я не уверен, что это правильный путь, в основном из-за этого пустого модуля AlgoRunnerProvider. Это какой-то другой способ добиться того, что я пытаюсь сделать? Или упростить то, что у меня есть?
Должен ли я просто создавать разные компоненты, OneAlgoRunnerComponent и TwoAlgoRunnerComponent, и внедрять менеджер из каждого из них?
Класс, который создает экземпляр Manager, использует этот компонент для внедрения AlgoRunner в этот экземпляр, чтобы Manager мог передать ему входные данные.
@Component(
modules = {
AlgoRunnerProvider.class
}
)
public interface AlgoRunnerComponent {
void inject(Manager manager);
AlgoRunner getAlgoRunner();
}
Модуль AlgoRunnerProvider
@Module
public class AlgoRunnerProvider {
@Provides
public AlgoRunner getAlgoRunner() {
return null;
}
}
OneAlgoRunnerProvider, который переопределяет метод обеспечивает в AlgoRunnerProvider. Может также иметь TwoAlgoRunnerProvider, который делает то же самое и предоставляет TwoAlgoRunner, если он расширяет AlgoRunner.
public class OneAlgoRunnerProvider extends AlgoRunnerProvider {
private final OneAlgo algo;
public OneAlgoRunnerProvider(OneAlgo algo) {
this.algo = algo;
}
@Override
public OneAlgoRunner getAlgoRunner() {
return new OneAlgoRunner(algo);
}
}
Все это используется вот так прямо сейчас:
AlgoRunnerComponent build = DaggerAlgoRunnerComponent.builder()
.algoRunnerProvider(new OneAlgoRunnerProvider(new OneAlgo()))
// .algoRunnerProvider(new TwoAlgoRunnerProvider(new TwoAlgo()))
.build();
Manager manager = managerComponent.getManager();
build.inject(manager);
Truth.assertThat(manager.algoRunner).isInstanceOf(OneAlgoRunner.class);
// Truth.assertThat(manager.algoRunner).isInstanceOf(OneAlgoRunner.class);
Большое спасибо!