Сменные модули с 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);

Большое спасибо!

Ответы на вопрос(1)

Ваш ответ на вопрос