Java Dagger-从单独的模块中提供相同的类
我有一些需要注入特定对象的类(让我们将其命名为Java Dagger-从单独的模块中提供相同的类,java,dependency-injection,dagger,Java,Dependency Injection,Dagger,我有一些需要注入特定对象的类(让我们将其命名为ToInject)。 问题在于,我无法从单独的模块中提供ToInject: @Module(injects={OneActivity.class}) public class OneActivityModule { @Provides public ToInject provideToInject(){ return new ToInject(...) } } @Module(injects={TwoActi
ToInject
)。
问题在于,我无法从单独的模块中提供ToInject
:
@Module(injects={OneActivity.class})
public class OneActivityModule {
@Provides
public ToInject provideToInject(){
return new ToInject(...)
}
}
@Module(injects={TwoActivity.class})
public class TwoActivityModule {
@Provides
public ToInject provideToInject(){
return new ToInject(...)
}
}
我在创建ObjectGraph时遇到此异常:
Caused by: java.lang.IllegalArgumentException: TwoActivityModule: Duplicate:
com.example.test.OneActivityModule$$ModuleAdapter$ProvideToInjectProvidesAdapter[key=com.example.test.ToInject method=com.example.test.OneActivityModule.provideToInject()]
com.example.test.TwoActivityModule$$ModuleAdapter$ProvideToInjectProvidesAdapter[key=com.example.test.ToInject method=com.example.test.TwoActivityModule.provideToInject()]
at dagger.ObjectGraph$DaggerObjectGraph.makeGraph(ObjectGraph.java:187)
at dagger.ObjectGraph$DaggerObjectGraph.access$000(ObjectGraph.java:138)
at dagger.ObjectGraph.create(ObjectGraph.java:129)
我知道我可以将移动到将提供者输入到单个模块,并使用限定符使其唯一,但为什么我不能这样做呢<代码>注入
是为每个模块指定的,这不是使这些提供程序也是唯一的吗
有什么建议吗
更新:
我考虑过了,真正的问题是我想配置ToInject
对象,根据哪个活动获取它ToInject
实际上是一个抽象类(上面的代码片段仅在示例中使用了“非抽象”类)
我的结论是,我应该只为ToInject
使用一个提供程序,这样我就可以通过更改一行代码来更改实现。但是我仍然需要根据获取对象的活动来配置ToInject
对象
所以主要的问题是,Dagger是否可以这样做,还是我必须将配置传递给每个活动,然后手动设置它
本例中的配置是一个ID(String
),要配置的对象(ToInject
,在本例中)是一个显示广告横幅的片段。我希望尽可能地将它与活动分开,以便在其他项目中重用它。我找到了足够的解决方案
这是一个库,负责提供抽象ToInject
的实现
@Module(library=true)
public class ProviderModule {
@Provides
public ToInject provideToInject(){
return new ToInjectConcrete1();
}
}
我可以用下面的方法创建特定于活动的模块。正如您所看到的,这个ToInject
提供程序方法有一个ToInject
参数,它实际上是由上面的库提供的。在我得到它之后,我可以针对我的活动进行进一步的配置
@Module(injects = OneActivity.class, includes = ProviderModule.class)
public class OneActivityModule {
@Provides
@Named("one")
public ToInject provideToInject(ToInject toInject) {
toInject.text = "overridden by one";
return toInject;
}
}
关键是限定符的用法(在本例中为@Named
限定符)
注意:
我的问题的根源是我假设单独模块中的提供者方法(定义了injects
)是唯一的。现在我知道,injects
用于编译时验证,和提供者的唯一性无关。具有相同返回类型的提供者可以通过限定符(例如@命名
)变得唯一,就像我在此解决方案中所做的那样。您可以调用活动onCreate
或onResume
方法,从到活动idI找到了一个解决方案,可以避免我这样做:)