2016-01-11 15 views
7

Sono nuovo a Dagger 2, cercando di eseguire il porting di un'applicazione (abbastanza) complessa.Grafico di dipendenza del Dagger 2: rilegato più volte

Abbiamo diverse dipendenze da librerie "comuni" (condivise con altri progetti). Queste librerie "comuni" a volte dipendono da altre librerie "comuni". Ogni libreria espone un modulo.

Un esempio:

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

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

nostro modulo Http dipende dalla JsonModule:

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

Infine nella mia richiesta, ho dipendono entrambi questi moduli:

@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); 
    } 
} 

Ho poi avere 1 componente che dipende dal mio MyAppModule:

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

Purtroppo, quando compilo il progetto, ottengo un errore di compilazione 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) 

Che cosa sto facendo di sbagliato? È sbagliato dipendere da un modulo due volte nello stesso grafico delle dipendenze?

+0

forse perché lo includi una volta in HttpModule e di nuovo in MyAppModule, prova a rimuovere 'include JsonModule' in uno di quei luoghi –

risposta

1

Sembra che il problema è legato alla situazione del nostro progetto:

  • i progetti comuni combinano Groovy e Java
  • i progetti comuni sono costruiti utilizzando Gradle
  • il progetto di applicazione combina Groovy e Java
  • il progetto di applicazione è stato costruito utilizzando Maven e il groove-eclipse-compilatore

In sostanza: per il momento incolpo il compilatore di groovy-eclipse. Ho convertito il progetto in Gradle e ora tutto funziona.

7

Nel MyAppModule non è necessario includere JsonModule, è incluso dal pugnale implicitamente. Quando includi il pugnale HttpModule includerai automaticamente tutti i moduli che includono HttpModule (nel tuo caso è JsonModule).

Problemi correlati