Dagger 2模块依赖图:多次绑定

时间:2016-01-11 12:01:08

标签: dagger dagger-2

我是Dagger 2的新手,试图将一个(非常)复杂的应用程序移植到它。

我们对'common'库有几个依赖(与其他项目共享)。那些“常见”库有时依赖于其他“常见”库。每个库都公开一个模块。

一个例子:

@Module
public class JsonModule {
    @Provides
    public Mapper provideMapper(ObjectMapper objectMapper) {
        return new DefaultMapper(objectMapper);
    }

    @Provides
    public ObjectMapper provideObjectMapper() {
        return ObjectMapperFactory.build();
    }
}

我们的HttpModule依赖于JsonModule:

@Module(includes = {JsonModule.class})
public class HttpModule {
    public HttpHelper provideHttpHelper(ObjectMapper objectMapper) {
        return new DefaultHttpHelper(objectMapper);
    }
}

最后在我的应用程序中,我依赖于这两个模块:

@Module(includes = {JsonModule.class, HttpModule.class})
public class MyAppModule {
    public Service1 provideService1(ObjectMapper objectMapper) {
        return new DefaultService1(objectMapper);
    }

    public Service2 provideService2(Mapper mappper) {
        return new DefaultService2(mappper);
    }
}

然后我有一个依赖于我的MyAppModule的组件:

@Component(modules = MyAppModule.class)
@Singleton
public interface MyAppComponent {
    public Service2 service2();
}

不幸的是,当我编译项目时,我得到了Dagger编译器错误:

[ERROR] com.company.json.Mapper is bound multiple times:
[ERROR] @Provides com.company.json.Mapper com.company.json.JsonModule.provideMapper(com.company.json.ObjectMapper)
[ERROR] @Provides com.company.json.Mapper com.company.json.JsonModule.provideMapper(com.company.json.ObjectMapper)

我做错了什么?在同一依赖图中依赖模块两次是错误的吗?

2 个答案:

答案 0 :(得分:10)

MyAppModule中,您不应该包含JsonModule,dagger会隐含地包​​含它。当包含HttpModule时,dagger会自动包含HttpModule包含的所有模块(在您的情况下为JsonModule)。

答案 1 :(得分:1)

问题似乎与我们项目的情况有关:

  • 常见项目结合了Groovy和Java
  • 使用Gradle构建常见项目
  • 应用程序项目结合了Groovy和Java
  • 应用程序项目是使用Maven和groovy-eclipse-compiler
  • 构建的

基本上:我现在责怪groovy-eclipse编译器。我将项目转换为Gradle,现在一切正常。