2016-12-28 8 views
1

Я использую Dagger 2 для ввода зависимостей и MVP в качестве шаблона проектирования приложения.Как я могу избежать установки всех модулей моего компонента в операции для ввода зависимостей с помощью Dagger 2?

У меня есть 2 вида деятельности (MainActivity и LoginActivity). Каждый из них реализует интерфейс (MainView и LoginView) и имеет соответствующий модуль (LoginModule и MainModule). С другой стороны, у меня есть MainComponent, который использует 2 модуля. Проблема заключается в следующем: Если я пытаюсь ввести зависимости в MainActivity, мне просто нужен MainModule, а не LoginModule, но использует 2 модуля на своем графике. Таким образом, я должен установить 2 модуля (поправьте меня, если я ошибаюсь), это должно быть что-то вроде этого:

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

Когда я впрыснуть в зависимости MainActivity мне просто нужно установить MainModule и в LoginActivity в LoginModule, нет обе. Как мне это сделать?

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

Как вы можете видеть MainModule и LoginModule, оба имеют один параметр в своих конструкторах (MainView и LoginView). Поэтому, зная, что MainActivity реализует MainView и LoginModule, реализует LoginView, если я в MainActivity, и я хочу установить зависимости. Мне нужно установить MainModule вот так: .mainModule(new MainModule(this)).build.inject(this). Но как насчет LoginModule? Как я могу избежать установки этого в этом упражнении, не удаляя его из модулей MainComponent? или как я могу его установить (я не могу использовать «ЭТО» в .loginModule(new LoginModule(this)) из-за MainActivity инвентаря MainView, но не 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(): 
} 

Спасибо заранее.

+0

Если '' MainActivity' реализует MainView', почему вам нужно вставить экземпляр «MainView» в «MainActivity»? – benji

ответ

1

LoginModule и MainModule должны иметь свои собственные компоненты.

Я бы предложил создать LoginComponent и MainComponent, а затем добавить их в MyApplicationComponent в качестве подкомпонентов.

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

} 

затем впрыскивают ваши действия

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

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