Dagger 2 构造函数注入等
Dagger 2 Constructor Injection and more
我有一些关于 dagger2 的问题,我觉得很难理解。此代码:
@Module
public class AppModule {
private MainApplication applicationContext;
@Inject
public AppModule(MainApplication context){
this.applicationContext = context;
}
@Provides
@Singleton
StuffA provideStuffA(){
return new StuffA();
}
@Provides
@Singleton
StuffB provideStuffB(StuffA){
return new StuffB(stuffA);
}
}
并且在应用程序中class:
appComponent = DaggerAppComponent.builder()
.appModule(new AppModule(this))
.build();
我的第一个问题是:
- 如果我想将 Module 分成 2 个,在 ModuleA 中提供 provideStuffA,在 ModuleB 中提供 StuffB,考虑到 B 依赖于 A,我该如何实现。
第二个问题:
- 我有一个在应用程序 class 中使用的对象,它来自应用程序 class 我调用活动中的注入。那么我如何在应用程序 class= 中访问该对象?我应该在上面的 Dagger 构建之后调用我的 applicationClass 注入吗?
最后一题
- 假设我有两个具有不同依赖关系的模块,我需要在同一个 activity 中使用它们。让一个组件和不同模块注入相同 activity.
的正确方法是什么
PS。如果这真的是基本的东西,我很抱歉,但我发现文档很差,也缺乏示例。提前致谢
回答 1
您只需将它们分成两个单独的模块。 Dagger 将构建图表,当在某个点 provideStuffB()
被调用时,它将用 StuffA
注入它。顺便说一句,我认为 provide
方法中存在小语法错误,应该是(缺少 stuffA 参数):
@Provides
@Singleton
StuffB provideStuffB(StuffA stuffA){
return new StuffB(stuffA);
}
回答2
是的,这是通常的方式。在您创建图形(在 onCreate()
中)之后,您将注入 this
(应用程序)。请注意,在使用这种方法进行单元测试时有一个微妙的警告 - Application
对象甚至会在调用 setUp()
方法之前创建,因此你将无法 set/swap 你的测试组件(并且您将始终使用默认组件)。解决方案是使用图的惰性初始化,即当第一个 activity(或服务,或 BroadcastReceiver
等)调用 getApplication().getInjector(this)
时,您必须在该点创建图。
回答3
您通常有一个包含所有模块和子组件的 top Component
。它(必须)能够注入所有活动。事实上,顶级组件用于生成图形。这是真实应用程序的示例:
@Component(modules = {IzgubenoDaggerModule.class,
AcraDaggerModule.class,
AppInfoDaggerModule.class,
SessionDaggerModule.class,
ComponentManagerDaggerModule.class,
NetworkInfoProviderDaggerModule.class,
DeviceInfoProviderDaggerModule.class,
KhRestExchangeManagerDaggerModule.class
})
@Singleton
public interface IzgubenoDaggerComponent extends GgLibDaggerComponent {
void inject(IzgubenoApplication app);
void inject(Act_Main act);
void inject(Act_ContactDetails act);
void inject(Act_MyPets act);
void inject(Act_PetEdit act);
void inject(Act_PetManage act);
void inject(Act_PetPics act);
//...
GgLibDaggerComponent newGgLibDaggerComponent(HttpsDaggerModule httpsMod,
KhRestDaggerModule khrestMod,
AppInfoDaggerModule appInfoMod,
GgServerDaggerModule ggServMod,
GgClientDaggerModule ggClientMod);
//...
}
我有一些关于 dagger2 的问题,我觉得很难理解。此代码:
@Module
public class AppModule {
private MainApplication applicationContext;
@Inject
public AppModule(MainApplication context){
this.applicationContext = context;
}
@Provides
@Singleton
StuffA provideStuffA(){
return new StuffA();
}
@Provides
@Singleton
StuffB provideStuffB(StuffA){
return new StuffB(stuffA);
}
}
并且在应用程序中class:
appComponent = DaggerAppComponent.builder()
.appModule(new AppModule(this))
.build();
我的第一个问题是:
- 如果我想将 Module 分成 2 个,在 ModuleA 中提供 provideStuffA,在 ModuleB 中提供 StuffB,考虑到 B 依赖于 A,我该如何实现。
第二个问题:
- 我有一个在应用程序 class 中使用的对象,它来自应用程序 class 我调用活动中的注入。那么我如何在应用程序 class= 中访问该对象?我应该在上面的 Dagger 构建之后调用我的 applicationClass 注入吗?
最后一题
- 假设我有两个具有不同依赖关系的模块,我需要在同一个 activity 中使用它们。让一个组件和不同模块注入相同 activity. 的正确方法是什么
PS。如果这真的是基本的东西,我很抱歉,但我发现文档很差,也缺乏示例。提前致谢
回答 1
您只需将它们分成两个单独的模块。 Dagger 将构建图表,当在某个点 provideStuffB()
被调用时,它将用 StuffA
注入它。顺便说一句,我认为 provide
方法中存在小语法错误,应该是(缺少 stuffA 参数):
@Provides
@Singleton
StuffB provideStuffB(StuffA stuffA){
return new StuffB(stuffA);
}
回答2
是的,这是通常的方式。在您创建图形(在 onCreate()
中)之后,您将注入 this
(应用程序)。请注意,在使用这种方法进行单元测试时有一个微妙的警告 - Application
对象甚至会在调用 setUp()
方法之前创建,因此你将无法 set/swap 你的测试组件(并且您将始终使用默认组件)。解决方案是使用图的惰性初始化,即当第一个 activity(或服务,或 BroadcastReceiver
等)调用 getApplication().getInjector(this)
时,您必须在该点创建图。
回答3
您通常有一个包含所有模块和子组件的 top Component
。它(必须)能够注入所有活动。事实上,顶级组件用于生成图形。这是真实应用程序的示例:
@Component(modules = {IzgubenoDaggerModule.class,
AcraDaggerModule.class,
AppInfoDaggerModule.class,
SessionDaggerModule.class,
ComponentManagerDaggerModule.class,
NetworkInfoProviderDaggerModule.class,
DeviceInfoProviderDaggerModule.class,
KhRestExchangeManagerDaggerModule.class
})
@Singleton
public interface IzgubenoDaggerComponent extends GgLibDaggerComponent {
void inject(IzgubenoApplication app);
void inject(Act_Main act);
void inject(Act_ContactDetails act);
void inject(Act_MyPets act);
void inject(Act_PetEdit act);
void inject(Act_PetManage act);
void inject(Act_PetPics act);
//...
GgLibDaggerComponent newGgLibDaggerComponent(HttpsDaggerModule httpsMod,
KhRestDaggerModule khrestMod,
AppInfoDaggerModule appInfoMod,
GgServerDaggerModule ggServMod,
GgClientDaggerModule ggClientMod);
//...
}