Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Dagger-从单独的模块中提供相同的类_Java_Dependency Injection_Dagger - Fatal编程技术网

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找到了一个解决方案,可以避免我这样做:)