我有一个Dagger 2依赖项,如果它是Activity
或其他某个上下文实例(例如,Service
),则会以不同方式提供。两者都指代相同的接口,但它们的实现方式各不相同。我怎么能用Dagger 2组织这个?
现在,我正在尝试使用两个不同的组件ActivityComponent
和ContextComponent
及其各自的模块,如下所示:
@ActivityScope
@Subcomponent(
modules = {
ActivityModule.class,
ContextModule.class
})
public interface ActivityComponent {
}
@Module
public class ActivityModule {
@Provides
@MyActivityQualifier
public MyObject provideMyObject() {
}
}
@ContextScope
@Subcomponent(
modules = {
ContextModule.class
})
public interface ContextComponent { }
@Module
public class ContextModule.class {
@Provides
public MyObject provideMyObject() {
}
}
然后,如果我在MyObject
中使用Activity
,我必须按如下方式添加限定符:
@Inject @MyActivityQualifier MyObject myObject;
这感觉不对,但我不确定为什么。还有更好的方法吗?
答案 0 :(得分:1)
您正在使用子组件 问题是:可以或者两个对象是否可见"可见" (可用,可注射,......)同时?
@Subcomponent
,并且不要将getMyInterface()
方法添加到您的父组件。并且没有任何其他选项,因为您有2个组件相互依赖。因此,您提供的信息可以很好地处理您的方法。
注意您还可以获得一个的实施资格。在我的项目中,我使用合格的@Named("public")
注释来实现没有用户数据的常见实现。如果我没有添加任何限定符,我将获得另一个限定符(不合格)。
使用独立的组件,例如ActivityAComponent
和ActivityBComponent
您可以切换使用不同模块提供的实现。