2016-07-01 7 views
0

In meinem aktuellen Projekt, das wir eine ApplicationComponent haben, die mit verschiedenen Modulen hält eine NetworkModule:Dagger 2 Cross-Module Dependency

DaggerApplicationComponent.builder() 
    .applicationModule(new ApplicationModule(this)) 
    .networkModule(new NetworkModule()) 
    .apiModule(new ApiModule()) 
    .build(); 

ich jetzt einrichten möchten ein UserServices Modul, das mindestens ein UserServices Objekt zur Verfügung stellen wird, und dieses Objekt benötigt einige der Bereitstellungen von den anderen Modulen zur Konfiguration. Zum Beispiel bietet die NetworkModule eine HttpLoggingInterceptor.Level, die für andere Netzwerkanrufe in der App verwendet wird, und ich möchte das gleiche in den UserServices Anrufe verwenden.

Beispiel aus der Debug-Version der NetworkModule:

@Module 
public class NetworkModule extends BaseNetworkModule { 
    HttpLoggingInterceptor.Level getHttpLoggingInterceptorLevel() { 
     return HttpLoggingInterceptor.Level.BODY; 
    } 
} 

Ich möchte in einem eigenen Modul zum Zweck der Verkapselung der UserServices bieten zu halten.

Wie ich das UserServices Modul eingerichtet haben, so dass es in der gleichen Komponente enthalten sein können, und haben Zugriff auf die Bietet im NetworkModule zur Konfiguration des UserServices Objekt, das er anbietet?

Dank

Antwort

0

Sie können Netzwerk-Modul als Abhängigkeit zu Ihrem UserServices Modul hinzufügen oder Netzwerkkomponente als abhängige Komponente UserServices Komponente hinzuzufügen. Wenn Sie als abhängige Komponente hinzugefügt werden, müssen Sie den Anbieter in der Netzwerkkomponente angeben.

1

Ich habe dies durch ein wenig Versuch und Irrtum herausgefunden. Wenn das Abhängigkeitsmodul bereits im component nicht enthalten ist, dann kann ich einfach die includes Parameter an die @Module Anmerkung hinzufügen:

@Module(includes= { 
     NetworkModule.class, 
     ApiModule.class 
    }) 

In meinem Fall ist das Abhängigkeitsmodul und einige andere sind an mehreren Stellen verwendet und alle nötig ist, um unabhängig in der component selbst. Zum Glück scheint es, dass Dagger mir Module über die gleiche Komponente schicken wird. Also musste ich wirklich nichts Besonderes in diesem Fall tun - Nur das in der Komponente:

@Singleton 
@Component(modules = { 
      ApplicationModule.class, 
      NetworkModule.class, 
      SchedulerModule.class, 
      ApiModule.class, 
      UserServicesModule.class 
    })