2013-10-30 5 views
5

Mein Team hat Dagger für die Abhängigkeitsinjektion in unserer Android App eingeführt und ich muss sagen, dass wir es bisher lieben. Wir möchten jedoch sicherstellen, dass wir es effizient nutzen. Ich habe mich gefragt, ob irgendjemand erklären kann oder ob es irgendwelche Unterlagen gibt, die die Fälle erklären, in denen Dagger auf die Reflexion von Abhängigkeiten zurückgreift?Gibt es eine Dokumentation darüber, wann Dagger beim Einspeisen von Abhängigkeiten auf Reflexion zurückgreift?

Antwort

9

Daggers Fallback-Logik ist in die FailoverLoader-Klasse eingebettet. Früher wurde ein Failover durchgeführt, wenn ein ModuleAdapter für ein bestimmtes Modul nicht geladen werden konnte. Die neuesten Releases werden jedoch mit einem Fehler fehlschlagen, wenn sie keinen ModuleAdapter laden können.

Zurzeit wird Dagger fehlschlagen, wenn es keine InjectAdapter-Klasse für einen bestimmten Typ findet, der injiziert werden muss. Der häufigste Fall ist, wenn Sie einen abstrakten Elternteil eines injizierbaren Typs haben, der keine @Inject-Felder enthält. In diesem Fall wird kein InjectAdapter dafür erstellt, und wenn der konkrete injizierbare Typ geladen wird, wird versucht, einen Adapter für das übergeordnete Element zu suchen, kann keinen finden und es wird eine reflektive Standardanmeldung erstellt.

Wenn man Code-Generierung nicht für Klassen ausführt, die mit @Inject-Feldern oder -Konstruktoren versehen sind, greift Dagger ebenfalls auf die Reflexion zurück. Es ist wirklich die gleiche Logik wie beim obigen Vererbungsfall, nur dass die Vererbung der einzige Fall ist, der nicht von einem Fehler beim Ausführen der Codegenerierung herrührt.

Nebenbei erzeugt der Google-Fork unter http://github.com/google/dagger derzeit Adapter, die ihre übergeordneten Typen verarbeiten, ohne einen Adapter für den übergeordneten (fest codierten übergeordneten Adapter) nachzuschlagen, so dass dieses Failover nicht in Google Fork auftritt. Wir haben den Google-Fork nicht in Maven veröffentlicht, da er bis vor kurzem fast identisch war. Wenn jedoch die Failover-Logik in übergeordneten Klassen ein Problem darstellt, möchten Sie möglicherweise ein Problem einreichen und nach einem Release fragen.

Verwandte Themen