2016-01-11 61 views
7

我是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(); 
    } 
} 

我們的HTTP模塊依賴於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); 
    } 
} 

然後我有1個組件取決於我的MyAppModule:

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

不幸的是,當我編譯項目,我得到一個匕首編譯器錯誤:

[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) 

我在做什麼錯?在相同的依賴關係圖中兩次依賴模塊是錯誤的嗎?

+0

也許是因爲您在HttpModule中包含了一次,並且在MyAppModule中再次包含它,請嘗試在其中一個位置刪除「包含JsonModule」 –

回答

1

好像這個問題是關係到我們的項目的情況:

  • 常見的項目結合Groovy和Java
  • 常見的項目都是使用搖籃
  • 應用項目結合Groovy和Java
  • 應用程序項目是使用Maven和groovy-eclipse編譯器構建的

基本上:我現在責怪groovy-eclipse編譯器。我將項目轉換爲Gradle,現在一切正常。

7

在您的MyAppModule中,您不應該包含JsonModule,它被隱式包含在匕首中。當包括HttpModule的匕首將自動包含HttpModule包含的所有模塊(在你的情況下,這是JsonModule)。