infinite state machine

Roboguice Injector

Introduction

user

Franziska Neumeister

Hat "Media Systems" studiert, entwickelt mobile Apps und will wissen, ob Androiden auch von elektrischen Schafen träumen


LATEST POSTS

Multithreading mit RxJava 18th April, 2016

Testbaren Code schreiben (Teil 1) 23rd April, 2015

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);
profile

Franziska Neumeister

Hat "Media Systems" studiert, entwickelt mobile Apps und will wissen, ob Androiden auch von elektrischen Schafen träumen

Navigation