Android
Roboguice Injector
Posted on .Die Injektion von Abhängigkeiten über Annotationen findet immer während der Erzeugung eines Objektes statt. Manchmal wird aber erst zu einem späteren Zeitpunkt eine neue Instanz benötigt, z.B. wenn der Benutzer einer Notiz-App einen neuen Eintrag anlegt in dem er eine Schaltfläche tippt. Jetzt benötigt die App ein neues Notiz-Objekt, ein neues View-Objekt, um den neuen Eintrag darzustellen und vielleicht noch weitere neue Objekte.
Um hier jetzt nicht doch den new
Operator benutzen zu müssen und die Verantwortung für die Konstruktion neuer Objekte zurück in die Geschäftslogik zu holen bietet Roboguice ein Injector-Objekt.
Dynamische Dependency Injection
Das Injector-Object ermöglicht dynamisch Injektionen durchzuführen. Man kann es benutzen, um entweder neue Instanzen einer Klasse oder eines Interfaces zu erhalten oder um nachträglich die Abhängigkeiten in ein Objekt injizieren lassen, dass zuvor klassisch über den new
Operator erzeugt wurde.
Einen Injector erhält man über eine statische Helfer-Methode der Roboguice-Klasse:
RoboInjector injector = RoboGuice.getInjector(context);
Die häufigste Verwendung des Injectors ist wohl die Erzeugng neuer Instanzen. Wird im Hintergrund der Objekt-Graph geändert, z.B. bei Tests, die Abhängigkeiten durch Mock-Objekte ersetzten, liefert der Injector die geänderte Implementierung. Darin liegt der große Vorteil des Injectors gegenüber dem new
Operator, der eine Klasse an eine konkrete Implementierung binden würde. Ein neues Objekt erhält man auf diese Weise
this.renderer = injector.getInstance(AbstractImageRenderer.class);
Manuelle Dependency Injection
Seltener kommt der Fall vor, dass man ein Objekt hat, dass nicht über Roboguice erzeugt wurde, in das manuell die Abhängigkeiten injiziert werden müssen. Das kann z.B. der Fall sein, wenn man statt von der RoboActivity
von einer anderen Activity
-Klasse erbt, um ein anderes Framework einzubinden und darauf hin nicht mehr die automatische Dependency Injection ausgelöst wird. Dazu existieren zwei Methoden, eine um @Inject und @InjectResource
Annotationen aufzulösen, die andere um @InjectView
Annotationen aufzulösen.
RoboInjector injector = RoboGuice.getInjector(getActivity());
// injiziert Resourcen und Java-Objekte
injector .injectMembersWithoutViews(aFragment);
// injiziert View-Objekte
injector .injectViewMembers(aFragment);