Dolch Modul Inclusion Cycle

7

Ich bin immer noch neu in Dolch und versuche, etwas zu verstehen. Ich wollte meine Module in logische Gruppen aufteilen, die jeweils ihre eigene Funktionalität bereitstellen, aber grundsätzlich so funktionieren würden, als ob sie in einem Modul wären.

Nehmen wir zum Beispiel an, dass mein Hauptanwendungsmodul wie folgt definiert ist:

%Vor%

Und ich habe ein anderes Modul, das so definiert ist, das eine ErrorReporter-Schnittstelle einrichtet und die konkrete Implementierung dafür bereitstellt.

%Vor%

In meiner Anwendungsklasse richte ich den Objektgraphen so ein:

%Vor%

Wenn ich den Dolch-Compiler starte, bekomme ich etwas wie folgt:

%Vor%

Was mache ich hier falsch? Ich nehme an, es hat etwas mit includes / addsTo zu tun, aber wenn ich diese entferne, bekomme ich andere Fehler.

Wenn ich includes = AnalyticsModule.class aus MyAppModule entferne, bekomme ich etwas wie folgt:

%Vor%

Alles ist in Ordnung, wenn ich komplett auf ein AnalyticsModule verzichte und dann den prosErrorReporter an MyAppModule weitergebe, aber dann muss ich meine konkrete impl-Klasse veröffentlichen, damit ich sie im anderen Modul verwenden kann.

    
Paul 03.02.2014, 18:55
quelle

2 Antworten

9

addsTo= gibt an, dass dieses Diagramm eine Erweiterung des referenzierten Moduls in einem übergeordneten / untergeordneten Diagramm darstellt. .plus () ist die Laufzeitversion von diesem. Sie benötigen nur .plus (), wenn Sie Instanzen mit kürzerer Laufzeit verwalten. Dies entspricht in etwa dem Begriff "Scope" in Guice und anderen DI-Containern.

In Ihrem Beispiel tun Sie:

%Vor%

Dies führt dazu, dass zwei Diagramme in einer Eltern / Kind-Beziehung erstellt werden, was hier nicht benötigt wird. In einer Android-App möchten Sie ein Diagramm für die Anwendung.

Sie können addsTo einfach entfernen, und MyAppModule wird automatisch AnalyticsModule instanziieren, oder Sie können beide übergeben, wenn Sie die dynamische Initialisierung wie folgt vermeiden möchten:

%Vor%

Der Moduleinschlusszyklus ist darauf zurückzuführen, dass Sie eine zyklische Beziehung zwischen diesen beiden Modulen haben und die Module selbst einen azyklischen Konfigurationsgraphen bilden müssen. MyAppModule enthält AnalyticsModule, das wiederum MyAppModule enthält. (addsTo ist ein weniger strenger includes = verwendet, um Dinge anzugeben, die aus übergeordneten Graphen erhalten werden)

    
Christian Gruber 20.02.2014, 22:31
quelle
13

@Module(includes = AnalyticsModule.class) ist nützlich zum Zusammenstellen mehrerer Module in einem Modul. In diesem Fall ist die Verwendung von .plus(new AnalyticsModule()) falsch, weil AnalyticsModule bereits von der Zeile includes in der Anmerkung eingeschlossen wurde. Daher sollten Sie den Aufruf von plus() entfernen.

@Module(addsTo = MyAppModule.class) ermöglicht den Aufruf von .plus(new AnalyticsModule()) . Da wir diesen Aufruf entfernt haben, sollten wir auch addsTo entfernen.

@Module(complete = false) ist für AnalyticsModule erforderlich, da einige seiner Abhängigkeiten nicht allein erfüllt werden können. Das ist in Ordnung; Solange MyAppModule complete = true (Standard) hat, führt Dagger die notwendige Fehlerprüfung durch.

Zugegebenermaßen war der Fehler "Modul Inclusion Cycle" ein wenig unklar. Der Zyklus wurde verursacht durch A einschließlich B, der zu A addiert.

    
Tavian Barnes 04.02.2014 23:14
quelle

Tags und Links