我正在使用Dagger 2将依赖关系和MVP注入我的应用程序设计模式。
我有2项活动(MainActivity
和LoginActivity
)。每个实现一个接口(尊重MainView
和LoginView
)并具有关联的模块(LoginModule
和MainModule
)。另一方面,我有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
注入依赖项时,我只需要设置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
并且我想注入依赖项,我需要设置{{1}像这样:MainModule
。但是.mainModule(new MainModule(this)).build.inject(this)
呢?如何避免在此活动中设置它而不必从LoginModule
的模块中删除它?或者如何设置它(由于MainComponent
实现.loginModule(new LoginModule(this))
而不是MainActivity
,我不能在MainView
中使用“THIS”?
MainComponent:
LoginView
提前致谢。
答案 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)
}