如何避免将所有组件的模块设置为 activity 以注入 Dagger 2 的依赖项?
How can I avoid to set all my component's modules in an activity to inject dependencies with Dagger 2?
我正在使用 Dagger 2 注入依赖项和 MVP 作为我的应用程序设计模式。
我有 2 个活动(MainActivity
和 LoginActivity
)。每个都实现一个接口(分别为 MainView
和 LoginView
)并有一个关联的模块(LoginModule
和 MainModule
)。另一方面,我有一个使用 2 个模块的 MainComponent
。问题如下:
如果我试图在 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
,而不是两者。我该怎么做?
登录模块:
@Module
public class LoginModule {
private LoginView loginView;
public LoginModule(LoginView view) {
loginView = view;
}
@Provides
public LoginView provideLoginView() {
return loginView;
}
主模块:
@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
呢?我怎样才能避免在 activity 中设置它而不必将其从 MainComponent
的模块中删除?或者我该如何设置它(我不能在 .loginModule(new LoginModule(this))
中使用 "THIS" 因为 MainActivity
实现了 MainView
而不是 LoginView
)?
主要组件:
@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():
}
提前致谢。
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)
}
我正在使用 Dagger 2 注入依赖项和 MVP 作为我的应用程序设计模式。
我有 2 个活动(MainActivity
和 LoginActivity
)。每个都实现一个接口(分别为 MainView
和 LoginView
)并有一个关联的模块(LoginModule
和 MainModule
)。另一方面,我有一个使用 2 个模块的 MainComponent
。问题如下:
如果我试图在 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
,而不是两者。我该怎么做?
登录模块:
@Module
public class LoginModule {
private LoginView loginView;
public LoginModule(LoginView view) {
loginView = view;
}
@Provides
public LoginView provideLoginView() {
return loginView;
}
主模块:
@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
呢?我怎样才能避免在 activity 中设置它而不必将其从 MainComponent
的模块中删除?或者我该如何设置它(我不能在 .loginModule(new LoginModule(this))
中使用 "THIS" 因为 MainActivity
实现了 MainView
而不是 LoginView
)?
主要组件:
@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():
}
提前致谢。
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)
}