2017-09-12 2 views
1

Verwenden Sie Dolch 2 in meinem Android mit MVP-Muster, und ein wenig mit einigen Konzepten kämpfen.Dolch 2: Inject Kind Klasse basierend auf Logik

Sagen wir, ich habe einen Moderator DashboardPresenter, ich bin es injizieren, wenn ich es in einer Aktivität oder andere Moderatoren müssen, unter Verwendung von:

@inject 
DashboardPresenter presenter; 

oder im Konstruktor von anderen Moderatoren:

@inject 
public AccountPresenter(DashboardPresenter presenter) { 
    //init 
} 

Jetzt bin ich nicht ganz sicher, wie es funktioniert, aber ich möchte folgendes tun:

Lassen sie uns sagen, dass ich eine BaseDashboardPresenter schaffen, die die Eltern sein

Und ich erstelle 2 Kinder dafür: NormalDashboardPresenter und ProDashboardPresenter beide erstreckt sich davon.

Wenn ich möchte es in einer Tätigkeit oder einem anderen Moderator verwenden, spritze ich die Basis Moderator von

@inject 
BaseDashboardPresenter presenter; 

Aufruf Und ich überschreiben die @inject Verhalten, eines der Kinder auf einem boolean Basis zu injizieren. So etwas wie folgt aus:

//in BaseDashboardPresenter 
override inject() { 
    if(Utility.checkIfUserIsPro()) { 
     inject ProDashboardPresenter(); 
    } else { 
     inject NormalDashboardPresenter(); 
    } 
} 

so aus meiner Tätigkeit Ich nenne nur die abstrakten Methoden in der Basisklasse, und der Unterschied ist nur, welches Kind injiziert wird.

Ist das möglich? Gerne bei Bedarf weitere Erläuterungen geben.

Antwort

1

Um dies zu tun, sollten Sie in Ihrem Modul so etwas wie hinzufügen:

@Provides 
public BaseDashboardPresenter provideDashboardPresenter(OtherPresenter presenter) { 
    if (Utility.checkIfUserIsPro()) { 
     return new ProDashboardPresenter(); 
    } else { 
     return new NormalDashboardPresenter(presenter); 
    } 
} 
+0

Hinzufügen von Logik zu einem '@ Bietet' Methode ist in der Regel keine gute Idee und es wird verwirrend und schwer zu pflegen, wenn beide Varianten unterschiedliche Abhängigkeiten haben –

+0

Sorry, dies aus meiner Frage weggelassen haben, aber NormalDashboardPresenter nimmt andere Moderatoren und Klassen als Argument und sie sind alle injiziert. '@ inject' ' public NormalDashboardPresenter (OtherPresenter) {} ' Also muss ich auch Instanz von OtherPresenter erstellen? – Youssef

+0

@DavidMedenjak Ja, du hast Recht. Dolch sollte nur Injektion verwalten und sollte keine Logik enthalten.Youssef, können Sie Extras Moderator als Argumente übergeben (Ich habe meine Antwort bearbeitet) – guillaume

1

Im Gegensatz zu der anderen Antwort, die ich glaube, dass Ihre Module keine Logik enthalten sollen. Das ist nicht das, was man erwarten würde.

Auch, wie würde Ihre @Provides Methode aussehen, wenn eine Variante A benötigt, während die andere von B abhängt? Jetzt müssen Sie Abhängigkeiten deklarieren, die Sie nicht benötigen, und es wird ab jetzt verwirrender.


Stattdessen sollten Sie ein Modul für jede Option erstellen und das richtige Modul in Ihre Komponente aufnehmen.

// module providing pro version 
componentBuilder.addPresenterModule(new ProModule()); 

// or a default one 
componentBuilder.addPresenterModule(new DefaultModule()); 

Auf diese Weise, wo immer Sie Ihre Komponente bauen, können Sie entscheiden, was darin enthalten sein soll. Ein noch dedizierterer Ansatz wäre die Verwendung von zwei völlig verschiedenen Komponenten, wobei jede Komponente verschiedene Module usw. verwendet. Dies könnte für komplexere Projekte sinnvoll sein, aber in Ihrem Fall scheint es, dass Module ausreichen würden.

+0

Vielen Dank für Ihre Antwort, Aber um sicherzugehen, dass ich verstehe, meinst du, ich erstelle 2 verschiedene Module und auf der Ebene der Aktivitätsinitialisierung mache ich die Prüfung und füge das gewünschte Modul hinzu? Wenn ja, was ist, wenn diese Module auch andere gemeinsame Abhängigkeiten haben, kann ich es als Basismodul erstellen, oder muss ich sie für jedes Modul wiederholen? Wenn also die Frage dumm scheint, versuche ich einfach in der Dolch-Welt anzufangen. – Youssef

+0

@Youssef Eine Komponente kann mehr als ein Modul haben, sodass Sie gemeinsame Abhängigkeiten in ein drittes Modul verschieben können –