Suche…


Einführung

Dagger 2 ist, wie auf GitHub erläutert , ein Entwicklungsansatz für die Abhängigkeitsinjektion während der Kompilierung. Um den in Dagger 1.x begonnenen Ansatz zu einem endgültigen Ergebnis zu bringen, beseitigt Dagger 2.x alle Reflexionen und verbessert die Code-Klarheit, indem der traditionelle ObjectGraph / Injector zugunsten der vom Benutzer angegebenen @Component Schnittstellen entfernt wird.

Bemerkungen

  1. Bibliotheksaufbau in Anwendung (für Maven-, Gradle- und Java-Projekte)
  2. Vorteile des Dragger-Einsatzes
  3. Wichtige Links (für Dokumentation und Demos)
  4. So integrieren und verwenden Sie Dragger-Komponenten

Dolch 2 API:

Dolch 2 macht einige spezielle Anmerkungen verfügbar:

@Module für die Klassen, deren Methoden Abhängigkeiten bereitstellen

@Liefert die Methoden innerhalb von @Module-Klassen

@Injekt zum Anfordern einer Abhängigkeit (Konstruktor, Feld oder Methode)

@Component ist eine Brückenschnittstelle zwischen Modulen und Injektion

GitHub: https://github.com/google/dagger

UserGuide (Google): https://google.github.io/dagger/users-guide.html

Videos: https://google.github.io/dagger/resources.html

Vogella Tutorial: http://www.vogella.com/tutorials/Dagger/article.html

Codepath-Tutorial: https://github.com/codepath/android_guides/wiki/Dependency-Injection-with-Dagger-2

Erstellen Sie @Module-Klasse und @Singleton-Annotation für Object

import javax.inject.Singleton;
import dagger.Module;
import dagger.Provides;

@Module
public class VehicleModule {
 
    @Provides @Singleton
    Motor provideMotor(){
        return new Motor();
    }
 
    @Provides @Singleton
    Vehicle provideVehicle(){
        return new Vehicle(new Motor());
    }
}

Jeder Anbieter (oder jede Methode) muss die Annotation @Provides und die Klasse die Annotation @Module . Die Annotation @Singleton zeigt an, dass es nur eine Instanz des Objekts gibt.

Anfordern von Abhängigkeiten in abhängigen Objekten

Nun, da Sie die Anbieter für Ihre verschiedenen Modelle haben, müssen Sie diese anfordern. So wie Vehicle Motor benötigt, müssen Sie die @Inject Annotation im Vehicle wie folgt hinzufügen:

@Inject
public Vehicle(Motor motor){
    this.motor = motor;
}

@Inject Annotation @Inject können Sie Abhängigkeiten im Konstruktor, in Feldern oder in Methoden anfordern. In diesem Beispiel halte ich die Injektion im Konstruktor.

@Module mit @Inject verbinden

Die Verbindung zwischen dem Anbieter von Abhängigkeiten, @Module , und den Klassen, die sie über @Inject anfordern, wird mithilfe von @Component , einer Schnittstelle:

import javax.inject.Singleton;
import dagger.Component;

@Singleton
@Component(modules = {VehicleModule.class})
public interface VehicleComponent {
    Vehicle provideVehicle();
}

Für die Annotation @Component müssen Sie angeben, welche Module verwendet werden sollen. In diesem Beispiel wird VehicleModule verwendet, das in diesem Beispiel definiert ist. Wenn Sie mehrere Module verwenden müssen, fügen Sie diese einfach mit einem Komma als Trennzeichen hinzu.

Verwenden der @Component-Schnittstelle zum Abrufen von Objekten

Da Sie nun jede Verbindung bereit haben, müssen Sie eine Instanz dieser Schnittstelle abrufen und ihre Methoden aufrufen, um das gewünschte Objekt abzurufen:

VehicleComponent component = Dagger_VehicleComponent.builder().vehicleModule(new VehicleModule()).build();
vehicle = component.provideVehicle();
Toast.makeText(this, String.valueOf(vehicle.getSpeed()), Toast.LENGTH_SHORT).show();

Wenn Sie versuchen, ein neues Objekt der Schnittstelle mit der @Component Annotation zu erstellen, müssen Sie dies mit dem Präfix Dagger_<NameOfTheComponentInterface> , in diesem Fall Dagger_VehicleComponent , Dagger_VehicleComponent und dann die Builder-Methode verwenden, um jedes Modul darin aufzurufen.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow