Sök…


Introduktion

Dagger 2, som förklarats på GitHub , är en utvecklingsstrategi för beredningstid för beroendeinjektion. Genom att ta tillvägagångssättet som startades i Dagger 1.x till sin slutliga slutsats, eliminerar Dagger 2.x all reflektion och förbättrar kodens tydlighet genom att ta bort den traditionella ObjectGraph / Injector förmån för användarspecificerade @Component gränssnitt.

Anmärkningar

  1. Biblioteksinställning i applikation (för maven, gradle, java-projekt)
  2. Fördelar med Dragger-användning
  3. Viktiga länkar (för dokumentation och demonstrationer)
  4. Hur man integrerar och använder Dragger-komponenter

Dagger 2 API:

Dagger 2 avslöjar ett antal speciella kommentarer:

@ Modul för de klasser vars metoder ger beroenden

@ Tillhandahåller för metoderna i klasserna @Module

@Injekt för att begära ett beroende (en konstruktör, ett fält eller en metod)

@Component är ett brygggränssnitt mellan moduler och injektion

Viktiga länkar:

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

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

Videor: 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

Skapa @Module Class och @Singleton-kommentar 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());
    }
}

Varje leverantör (eller metod) måste ha @Provides anteckningen och klassen måste ha @Module kommentaren. @Singleton anteckningen indikerar att det bara kommer att finnas ett exempel på objektet.

Begär beroenden i beroende objekt

Nu när du har leverantörerna för dina olika modeller måste du begära dem. Precis som Vehicle behöver Motor måste du lägga till @Inject kommentaren i Vehicle enligt följande:

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

Du kan använda @Inject anteckningen för att begära beroenden i konstruktören, fälten eller metoderna. I det här exemplet håller jag injektionen i konstruktören.

Ansluter @Moduler med @Inject

Anslutningen mellan leverantören av beroenden, @Module , och klasserna som begär dem via @Inject görs med @Component , som är ett gränssnitt:

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

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

För @Component anteckningen måste du ange vilka moduler som ska användas. I det här exemplet används VehicleModule , som definieras i detta exempel . Om du behöver använda fler moduler, lägg bara till dem med komma som separator.

Använda @Component Interface för att få objekt

Nu när du har varje anslutning klar måste du skaffa en instans av detta gränssnitt och åberopa dess metoder för att få det objekt du behöver:

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

När du försöker skapa ett nytt objekt i gränssnittet med @Component annotationen, måste du göra det med prefixet Dagger_<NameOfTheComponentInterface> , i detta fall Dagger_VehicleComponent , och använd sedan byggmetsmetoden för att ringa varje modul inom.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow