如何避免在活动中设置我的所有组件模块以注入Dagger 2的依赖项?

时间:2016-12-28 22:21:25

标签: java android dependency-injection dagger-2 dagger

我正在使用Dagger 2将依赖关系和MVP注入我的应用程序设计模式。

我有2项活动(MainActivityLoginActivity)。每个实现一个接口(尊重MainViewLoginView)并具有关联的模块(LoginModuleMainModule)。另一方面,我有MainComponent使用2个模块。问题如下: 如果我试图在MainActivity中注入依赖项,我只需要MainModule,而不是LoginModule,但MainComponent使用图表中的2个模块。所以,我必须设置2个模块(如果我错了,请纠正我),它应该是这样的:

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

当我在MainActivity注入依赖项时,我只需要设置MainModuleLoginActivity 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;
    }
}

正如您所见MainModuleLoginModule,两者在其构造函数中都有一个参数(MainViewLoginView)。因此,知道MainActivity实现MainViewLoginModule实现LoginView,如果我在MainActivity并且我想注入依赖项,我需要设置{{1}像这样:MainModule。但是.mainModule(new MainModule(this)).build.inject(this)呢?如何避免在此活动中设置它而不必从LoginModule的模块中删除它?或者如何设置它(由于MainComponent实现.loginModule(new LoginModule(this))而不是MainActivity,我不能在MainView中使用“THIS”?

MainComponent:

LoginView

提前致谢。

1 个答案:

答案 0 :(得分: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)
}