2016-12-28 1 views
1

Ich verwende Dagger 2, um Abhängigkeiten und MVP als mein Anwendungsdesignmuster zu injizieren.Wie kann ich vermeiden, alle Module meiner Komponente in eine Aktivität zu setzen, um Abhängigkeiten mit Dagger 2 zu injizieren?

Ich habe 2 Aktivitäten (MainActivity und LoginActivity). Jeder implementiert eine Schnittstelle (MainView und LoginView respektvoll) und ein zugeordnetes Modul (LoginModule und MainModule). Auf der anderen Seite habe ich eine MainComponent, die die 2 Module verwendet. Das Problem ist folgendes: Wenn ich versuche, Abhängigkeiten in MainActivity zu injizieren, brauche ich nur die MainModule, nicht die LoginModule, aber die MainComponent nutzt die 2 Module in seinem Diagramm. Also, ich habe die zwei Module setzen (korrigieren Sie mich, wenn ich falsch liege), sollte es so etwas wie dieses:

public void setupComponent(MyApplicationComponent appComponent){ 
    DaggerMainComponent.builder() 
     .myApplicationComponent(appComponent) 
     .mainModule(new MainModule(this)) 
     .loginModule(new LoginModule(???)) 
     .build.inject(this); 
} 

Wenn ich Abhängigkeiten in MainActivity injizieren Ich muss nur die MainModule gesetzt und in LoginActivity der LoginModule, nicht beides. Wie kann ich es tun?

Loginmodule:

@Module 
public class LoginModule { 

    private LoginView loginView; 

    public LoginModule(LoginView view) { 
     loginView = view; 
    } 

    @Provides 
    public LoginView provideLoginView() { 
     return loginView; 
    } 

MainModule:

@Module 
public class MainModule { 
    private MainView mainView; 

    public MainModule(MainView mainView){ 
     this.mainView=mainView; 
    } 

    @Provides MainView provideMainView(){ 
     return mainView; 
    } 
} 

Wie Sie MainModule und LoginModule sehen können, beide haben einen Parameter in ihren Konstrukteuren (MainView und LoginView). Also wissend, dass MainActivity implementiert MainView und LoginModule implementiert LoginView, Wenn ich in MainActivity bin und ich Abhängigkeiten injizieren möchte, muss ich setzen MainModule wie folgt: .mainModule(new MainModule(this)).build.inject(this). Aber was ist mit LoginModule? Wie kann ich vermeiden, es in dieser Aktivität zu setzen, ohne es aus den Modulen MainComponent zu entfernen? oder wie kann ich es einstellen (ich kann nicht "THIS" in .loginModule(new LoginModule(this)) wegen MainActivity implementiert MainView aber nicht LoginView)?

MainComponent:

@ActivityScope 
@Component(
     dependencies = MyApplicationComponent.class, 
     modules = {LoginModule.class, MainModule.class} 
) 

public interface MainComponent { 
    void inject(LoginActivity loginActivity); 
    void inject(MainActivity mainActivity); 
    LoginPresenterImp getLoginPresenter(); 
    MainPresenterImp getMainPresenter(): 
} 

Vielen Dank im Voraus.

+0

spritzen Wenn '' MainActivity' implementiert MainView', warum Müssen Sie eine Instanz von 'MainView' in' MainActivity' einfügen? – benji

Antwort

1

LoginModule und MainModule sollten ihre eigenen Komponenten haben.

Ich würde vorschlagen, eine LoginComponent und eine MainComponent und dann fügen Sie sie zu MyApplicationComponent als Unterkomponenten.

@ApplicationScope 
@Component(
    modules = {ApplicationModule.class}) 
public interface ApplicationComponent { 

    void inject(Application application); 

    MainComponent plus(MainModule mainModule); 
    LoginComponent plus(LoginModule loginModule); 

} 

////

@ActivityScope 
@Subcomponent(
    modules = { 
      MainModule.class, 
    } 
) 
public interface MainComponent { 

    void inject(MainActivity mainActivity); 

} 

////

@ActivityScope 
@Subcomponent(
    modules = { 
      LoginModule.class, 
    } 
) 
public interface LoginComponent { 

    void inject(LoginActivity loginActivity); 

} 

dann Ihre Aktivitäten

public void setupComponent(ApplicationComponent appComponent){ 
appComponent.plus(new MainModule(this)).inject(this) 
} 

public void setupComponent(ApplicationComponent appComponent){ 
appComponent.plus(new LoginModule(this)).inject(this) 
} 
Verwandte Themen