ustauschbare Module mit Dagger

So habe ich einen Code, der einen Algorithmus ausführt, zum Beispiel mit einer AlgoRunner-Klasse. Jetzt kann diese AlgoRunner-Klasse auf verschiedene Arten implementiert werden, um mithilfe von Algo-Klassen verschiedene Algorithmen auszuführen. Ich möchte mit Dagger 2 verschiedene Implementierungen der AlgoRunner-Klasse für eine "Manager" -Klasse bereitstellen, die Eingaben an AlgoRunner sowie andere von ihr verwaltete Komponenten weitergibt.

Frag

Ich habe momentan Folgendes, bin mir aber nicht sicher, ob dies der richtige Weg ist, hauptsächlich wegen des leeren AlgoRunnerProvider-Moduls. Ist das eine andere Möglichkeit, das zu erreichen, was ich versuche? Oder zu vereinfachen, was ich habe?

Sollte ich nur verschiedene Komponenten, OneAlgoRunnerComponent und TwoAlgoRunnerComponent, erstellen und den Manager aus jeder dieser Komponenten einfügen?

Die Klasse, die die Manager-Instanz erstellt, verwendet diese Komponente, um den AlgoRunner in diese Instanz zu injizieren, sodass der Manager die Eingaben an ihn übergeben kann.

@Component(
        modules = {
                AlgoRunnerProvider.class
        }
)
public interface AlgoRunnerComponent {
    void inject(Manager manager);
    AlgoRunner getAlgoRunner();
}

AlgoRunnerProvider Module

@Module
public class AlgoRunnerProvider {

    @Provides
    public AlgoRunner getAlgoRunner() {
        return null;
    }
}

OneAlgoRunnerProvider, der die Methode offers in AlgoRunnerProvider überschreibt. Könnte auch einen TwoAlgoRunnerProvider haben, der dasselbe tut und TwoAlgoRunner bereitstellt, solange dies AlgoRunner erweitert.

public class OneAlgoRunnerProvider extends AlgoRunnerProvider {
    private final OneAlgo algo;

    public OneAlgoRunnerProvider(OneAlgo algo) {
        this.algo = algo;
    }

    @Override
    public OneAlgoRunner getAlgoRunner() {
        return new OneAlgoRunner(algo);
    }
}

Alles wird momentan so verwendet:

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);

Danke vielmals

Antworten auf die Frage(2)

Ihre Antwort auf die Frage