我正在使用具有简单 MVP 模式的 Dagger 2。我有一个 @PerApp
和 @PerActivity
作用域。我正在使用构造函数注入(inject)来注入(inject)演示者依赖项,这使得这些演示者“可注入(inject)”(我不需要在 Activity 模块中编写提供方法)。代码 fragment :
每个应用:
// AppComponent
@PerApp
@Component(modules = {AppModule.class, DataModule.class, NetworkModule.class})
public interface AppComponent {
LoginComponent plus(LoginModule loginModule);
MainComponent plus(MainModule mainModule);
}
// Example @PerApp module
@Module
public class NetworkModule {
@Provides
@PerApp
Retrofit providesRetrofit(){
...
}
}
PerActivity:
// LoginModule
@Module
public class LoginModule {
private final LoginActivity mLoginActivity;
public LoginModule(LoginActivity loginActivity) {
mLoginActivity = loginActivity;
}
@Provides
@PerActivity
Context providesContext() {
return mLoginActivity;
}
}
// LoginComponent
@PerActivity
@Subcomponent(
modules = LoginModule.class
)
public interface LoginComponent {
void inject(LoginActivity loginActivity);
}
Activity :
public class LoginActivity {
@Inject LoginPresenter mPresenter;
}
主持人:
public class LoginPresenter {
@Inject
public LoginPresenter(Retrofit retrofit) {
...
}
}
效果很好。我的问题是:所提供的 LoginPresenter
的范围是什么?它会和 LoginActivity
一样吗?我应该用 @PerActivity
或其他东西来注释演示者的构造函数吗?
最佳答案
我已经运行了一些测试来自行检查作用域如何与构造函数注入(inject)一起工作,这是我的结果。
1) 将LoginPresenter
注入(inject)LoginActivity
:
LoginComponent
- @PerActivity
范围 (代码与我第一篇文章中的代码完全相同)。
我尝试将演示者注入(inject) 2 个变量:
public class LoginActivity {
@Inject LoginPresenter A;
@Inject LoginPresenter B;
}
LoginPresenter
注释为:
- nothing -
A
和B
不同 - @PerActivity -
A
和B
相同 - @PerApp -
A
和B
相同
2) 将LoginPresenter
注入(inject)LoginActivity
和MainActivity
:
LoginComponent
, MainComponent
- @PerActivity
scope (代码与我第一篇文章中的完全一样) .
我尝试将演示者注入(inject)到 2 个不同的 Activity 中:
public class LoginActivity {
@Inject LoginPresenter A;
}
public class MainActivity {
@Inject LoginPresenter B;
}
LoginPresenter
注释为:
- nothing -
A
和B
不同 - @PerActivity -
A
和B
不同 - @PerApp -
A
和B
相同
关于java - Dagger 2 - 构造函数注入(inject) - 作用域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36447251/