2016-03-21 6 views
0

Ich versuche, ein Projekt, in dem ich zwei Module haben common-lib und app.Dolch 2: Gradle Modul Abhängigkeit mit der Implementierung in einem anderen Modul

Das lib-Modul hat eine eigene Dolch-Komponente und Module und soll geschmacksunabhängig sein.

Nun hängt ein Teil davon von aromespezifischen Ressourcenwerten ab, die im Modul app deklariert sind, also habe ich versucht, die Komponente über eine Schnittstelle zu abstrahieren und ihre Implementierung im Modul app zu überschreiben.

Dolch-Modul deklarieren in common-lib Gradle-Modul, Abhängigkeiten mit NoOp-Implementierungen zu erfüllen.

@Module 
public class NetworkConfigModule { 
    @Provides 
    @Singleton 
    HeaderParams providesHeaderParams(NoOpHeaderParams noOpHeaderParams){ 
     return noOpHeaderParams; 
    } 

    @Provides 
    @Singleton 
    AppHostsProvider providesAppHostsProvider(NoOpAppHostsProvider noOpAppHostsProvider){ 
     return noOpAppHostsProvider; 
    } 
} 

Dagger Modul deklariert in app gradle Modul, Abhängigkeiten mit der tatsächlichen Umsetzung zu erfüllen.

Dies funktioniert nicht, weil Dolch nicht gerade die Modul-Klasse überschreibt, aber das ist irgendwie zu erwarten.

Meine Frage ist, wie ich meine Dagger Module einrichten können, damit ich HeaderParams und AppHostsProvider Schnittstellen in common-lib verwenden können, aber ich spritze ihre Implementierungen in app.

Antwort

2

Der einfachste Weg wäre, nur die Komponentenerstellung in Ihrem app zu behandeln.

In Ihrer App kennen Sie die tatsächlichen Module und Klassen, die Sie verwenden möchten. Wenn Sie die Komponente dort erstellen, können Sie einfach das richtige Modul zur Komponente hinzufügen, Ihre common-lib Klassen injizieren und fertig sein.


Wenn Sie die Injektion in Ihrer App nicht behandeln möchten, müssen Sie eine Schnittstelle definieren, z.

interface NetworkComponentHolder { 
    NetworkComponent getNetworkComponent(); 
} 

die dann wiederum könnten Sie mit Ihrem Application in app implementieren. Auch hier würden Sie die Komponente und Module in Ihrem app, aber dann von Ihrem Modul erstellen müssen Sie

nennen
((NetworkComponentHolder) getApplication()).getNetworkComponent().inject(this); 

Dies ohne Reflexion die 2 Möglichkeiten wäre.

+0

Hey David, danke für deine Antwort, es klingt gut, aber ich kämpfe immer noch um jeden Teil deines zweiten Vorschlags ... Wenn NetworkComponentHolder und NetworkComponent beide im 'common-lib'-Modul sind, stehe ich nicht vor dem gleichen Problem, weil ich die Implementierung ihrer Abhängigkeiten nicht bereitstellen kann? – mdelolmo

+0

@mdelolmo Sie würden die Anwendung die Schnittstelle implementieren lassen, dann können Sie einen Verweis auf die Anwendung in der Bibliothek abrufen und auf die Komponente zugreifen, indem Sie die Schnittstelle verwenden. Dies ist, wenn Sie 'component.inject (this)' irgendwo in Ihrem Modul aufrufen müssen –