Dependency Injection Med Dagger 2 på Android
52
Del
13
Del
Dette Cyber mandag Envato Tuts + kurs vil bli redusert til bare $ 3. Ikke gå glipp av.
Avhengighet injeksjon er et designmønster fokusert på å gjøre våre programmer løst koplet, utvidbar, og vedlikeholdsvennlig. I denne opplæringen vil du lære hvordan du skal håndtere avhengighet injeksjon ved hjelp Dagger 2.
Innledning
Når du har et objekt som trenger eller avhengig av et annet objekt for å gjøre sitt arbeid, du har en avhengighet. Avhengigheter kan løses ved å la den avhengige objekt skape avhengighet eller spør en fabrikk objekt for å lage en. I forbindelse med avhengighet injeksjon, men er avhengig tilføres klassen som trenger avhengigheten for å unngå behovet for klassen selv for å lage dem. På denne måten kan lage programvare som er løst koplet og svært vedlikeholdsvennlig.
Denne opplæringen bruker den nyeste versjonen av Dagger, Dagger 2. I skrivende stund Dagger 2 er ikke offisielt lansert ennå, og er i pre- alpha stadiet. Imidlertid er det brukbart og stabilt. Du kan besøke Dagger på GitHub å få nyheter om prosjektet og mulige datoer for den offisielle utgivelsen.
Forutsetninger
Du vil trenge den nyeste versjonen av Android Studio installert på utviklingsmaskinen, som du kan laste ned fra Android Developer nettstedet.
1. Dagger to API
Dagger 2 avslører en rekke spesielle merknader:
Module forthe klasser som har metoder gir avhengig
Provides for methodswithinModule klasser
Inject å be om en avhengighet (en konstruktør, unna, eller en metode)
Component er en bro grensesnitt mellom moduler og injeksjon
Dette er de mest viktige merknader du trenger å vite om å komme i gang med avhengighet injeksjon ved hjelp Dagger 2. Jeg skal vise deg hvordan touse dem på en enkel Android applikasjon.
2. Dagger to Arbeidsflyt
Å implementere dolk 2 riktig, må du følge disse trinnene.
Identifisere avhengige objekter og dets avhengig
Lag en klasse med Module merknader, brukerProvides annotering for hver metode som returnerer en avhengighet.
Request avhengigheter i dine avhengige objekter ved hjelp avInject merknaden.
Lag et grensesnitt ved hjelp avComponent merknader og legge klassene medModule merknad opprettet i andre trinn.
Lag et objekt avComponent grensesnittet på å bruke den avhengige objekt med sine avhengigheter.
Avhengighet analyse forskyves fra kjøretid til kompilering. Det betyr at du blir varslet om mulige problemer i utbyggingsfasen, i motsetning til andre biblioteker, for eksempel Guice. Før du bruker Dagger 2 bibliotek, må du forberede din Android Studio installasjonen for å få tilgang de genererte klassene.
3. Android Studio Miljø Setup
Trinn 1
Opprett en ny søknad med Android Studio og gi den et navn. Jeg har kalt prosjektet mitt TutsplusDagger.
Trinn 2
Sett Minimum SDK for prosjektet til API 10 å nå så mange enheter som mulig.
Trinn 3
Velg Blank oppsettet for den aktiviteten du oppretter. For denne opplæringen, trenger du ikke en spesiell layout.
Trinn 4
navn aktiviteten MainActivity og klikk Fullfør.
Med prosjekt som er opprettet, må du gjøre noen få modifikasjoner av de gradle filer. La oss gjøre disse endringene i neste trinn.
4. Konfigurering Gradle Setup
Trinn 1
Vi må endre prosjektets build.gradle fil som vist nedenfor.
Buildscript {repositories {jcenter ()} avhengig {klassebane 'com.android. tools.build:gradle:1.0.0~~number=plural 'CLASSPATH' com.neenbedankt.gradle.plugins: android-apt: 1,4 '}} allprojects {repositories {mavenCentral () maven {url' https://oss.sonatype.org/content /repositories /snapshots /'}}}
La oss ta et øyeblikk å se hvilke endringer vi har gjort:
avhengig: I denne delen har jeg lagt en plugin som kommer til å være nyttig for å få tilgang til koden generert av Dagger. Hvis du ikke gjør det, vil du se feil når det refereres til disse nye klassene
allprojects. Denne endringen er nødvendig siden de bibliotekene vi kommer til å bruke er for tiden i pre-alpha, og dette er bare plassere tilgjengelig hvis du vil ha tilgang themusing Maven. Du kan prøve å laste ned Dagger og Dagger Iler biblioteker fra Sonatype, men denne opplæringen er basert på Mavenrepositories.
Trinn 2
Åpne build.gradle i prosjektets app mappen og endre det som vist nedenfor
gjelder plugin. 'com.android.application'apply plugin:' com.neenbedankt.android-apt'android {compileSdkVersion 21 buildToolsVersion "21.1.2" defaultConfig {applicationId "com.androidheroes.tutsplusdagger "minSdkVersion 10 targetSdkVersion 21 version en versjon" 1.0 "} buildTypes {utslipp {minifyEnabled falsk proguardFiles getDefaultProguardFile ('ProGuard-android.txt'), 'proguard-rules.pro'}}} avhengig {kompilere fileTree (dir: 'libs' inkluderer: ['* .jar']) kompilere 'com.android.support:appcompat-v7:21.0.3' kompilere 'com.google.dagger: dolk: 2,0-SNAPSHOT' apt 'com.google.dagger: dolk -compiler: 2,0-SNAPSHOT 'tilgjengelig' org.glassfish: javax.annotation: 10,0-b28 '}
I begynnelsen av filen, jeg påfører det nye plugin. Besure å sette den nye plugin (com.neenbedankt.android-apt) under eller etter Android plugin. . Hvis du ikke gjør det, så det kommer til å vise feil når du prøver tosynchronize prosjektet med gradle filer
I avhengig jeg la til:
dolk bibliotek
dolk-kompilatoren for kodegenerering
javax.annotation for ytterligere merknader kreves utenfor Dagger
Etter oppdatering Dagger konfigurasjon, kan du synkronisere prosjektet withthe gradle filer ved å klikke på knappen på toppen .
På dette punktet har du et tomt prosjekt klar til å brukes i programmet. Hvis du ser noen feil, sørg for at du har riktig fulgt fremgangsmåten ovenfor. Vi kan nå fortsette å implementere vårt eksempel prosjektet.
5. Implementering Dagger 2
Trinn 1: Identifiser avhengige objekter
For denne opplæringen, kommer jeg til å jobbe med to klasser, Vehicle og Motor. Motoren er den uavhengige klasse og Vehicle Dette er hva Motor klassen se ut: Denne klassen har bare én attributt kalt rpm, som jeg kommer til å endre gjennom akselerere og bremse metoder. Og jeg skal sjekke den nåværende verdien ved hjelp av getRpm metoden Dette er hva Vehicle klassen ser slik ut:. I denne klassen, kan du se at jeg ikke er å skape et nytt objekt av Motor klassen, selv om jeg bruker sine metoder. I en virkelig verden søknad, bør denne klassen har flere metoder og egenskaper, men la oss holde det enkelt for nå Du har nå til å lage en klasse med denModule merknader. Denne klassen kommer til å gi objektene du trenger med sine avhengig fornøyd. For dette, må du opprette en ny pakke (bare for å holde det i orden), navn det modul og legge til en ny klasse innenfor det som følger: Som jeg angav i trinn 1, Vehicle needsMotor å fungere ordentlig. Det er derfor du trenger for å lage twoproviders, en for Motor (den uavhengige modell) og en annen for Vehicle (som indikerer dens avhengighet) . Ikke glem at hver leverandør (eller metode ) må ha @ Gir merknader og klassen må haModule annotation.TheSingleton merknad indikerer at det vil være bare oneinstance av objektet Nå som du har leverandørene for ulike modeller, trenger du torequest dem. Akkurat som Vehicle må Motor, må du legge tilInject merknad i Vehicle konstruktør som følger: Youcan brukeInject merknaden til forespørsel avhengigheter i konstruktøren, felt, eller metoder. I dette tilfellet, jeg holder theinjection i konstruktøren Sammenhengen mellom leverandøren av avhengigheter,Module , og theclasses ber dem gjennomInject er laget ved hjelp @ Component, som er et grensesnitt: Ved siden avComponent merknader, må du angi hvilke moduler skal brukes i denne casei bruke VehicleModule, som vi opprettet tidligere. Hvis du trenger å bruke flere moduler, så bare legge dem ved hjelp av et komma som skilletegn. Innenfor grensesnittet, legge til metoder for hvert objekt du trenger, og den vil automatisk giveyou en med alle sine avhengig fornøyd. I dette tilfellet, jeg trenger bare aVehicle objektet, som er grunnen til at det er bare en metode Nå som du har alle tilkoblings klar, må skaffe aninstance av dette grensesnittet og påberope sine metoder for å få theobject du trenger. Jeg kommer til å gjennomføre det i onCreate metoden i MainActivity som følger: Når du prøver å opprette et nytt objekt av grensesnittet medComponent merknader, må du gjøre det ved hjelp av prefiks Dagger_ < NameOfTheComponentInterface >, i dette tilfellet Dagger_VehicleComponent, og deretter bruke byggmester metode for å ringe hver modul innenfor. Du kan se at den magiske skjer på linje 23. Du er bare ber om ett objekt av klassen Vehicle Hotell og biblioteket er en ansvarlig for å tilfredsstille alle avhengig Dette objektet må. Igjen du kan se er det ingen ny forekomst av en annen objekt alt administreres av biblioteket. Du kan nå kjøre programmet og prøve det på din enhet eller i en emulator. Hvis youfollowed opplæringen trinn for trinn, vil du se en Toast melding om den opprinnelige verdien eller rpm variabel. I den vedlagte prosjektet, kan du se en egendefinert brukergrensesnitt for MainActivity klassen, i som du kan endre verdien av rpm variabel ved å trykke på knappene på skjermen. Avhengighet injeksjon er et mønster som du er nødt til å implementsooner eller senere i dine egne applikasjoner. Med Dagger 2, youhave en lett-å-bruke biblioteket for å gjennomføre det. Jeg håper du fant thistutorial nyttig, og ikke glem å dele den hvis du likte det.
er avhengig klassen. . Jeg kommer til å begynne å lage denne modellen i en ny pakke kalt modell
pakke com.androidheroes.tutsplusdagger.model; /** * Laget av kerry på 14/02/15. * /public class Motor {private int rpm; offentlig Motor () {this.rpm = 0; } Public int getRpm () {return rpm; } Public void akselerere (int verdi) {rpm = rpm + verdi; } Public void brems () {rpm = 0; }}
Pakke com.androidheroes.tutsplusdagger.model; /** * Laget av kerry på 14 /02/15. * /public class Vehicle {private Motor motor; offentlig Vehicle (Motor motor) {this.motor = motor; } Public void increaseSpeed (int verdi) {motor.accelerate (verdi); } Public void stop () {motor.brake (); } Public int getSpeed () {return motor.getRpm (); }}
Trinn 2:. LagModule Class
pakke com.androidheroes.tutsplusdagger.module; import com.androidheroes.tutsplusdagger .model.Motor, import com.androidheroes.tutsplusdagger.model.Vehicle, import javax.inject.Singleton, import dagger.Module, import dagger.Provides; /** * Laget av kerry på 14/02/15. * /@ Modulepublic klasse VehicleModule {ProvidesSingleton Motor provideMotor () {return new Motor (); }ProvidesSingleton Vehicle provideVehicle () {return new Vehicle (ny Motor ()); }}
Trinn 3:. Request Avhengig i avhengige objekter
Injectpublic Vehicle (Motor motor) {this.motor = motor;}
Trinn 4:. Tilkobling @ Moduler MedInject
pakken com.androidheroes.tutsplusdagger.component; import com.androidheroes.tutsplusdagger.model.Vehicle; import com.androidheroes.tutsplusdagger.module.VehicleModule, import javax.inject.Singleton, import dagger.Component; /** * Laget av kerry på 14/02/15. * /@ Singleton @ Component (moduler = {VehicleModule.class}) felles grensesnitt VehicleComponent {Vehicle provideVehicle ();}
Trinn 5:. BrukeComponent Interface du tak i objekter
pakke com.androidheroes.tutsplusdagger, import android.support.v7.app.ActionBarActivity, import android.os.Bundle; import android.widget. Toast, import com.androidheroes.tutsplusdagger.component.Dagger_VehicleComponent, import com.androidheroes.tutsplusdagger.component.VehicleComponent, import com.androidheroes.tutsplusdagger.model.Vehicle, import com.androidheroes.tutsplusdagger.module.VehicleModule; public class MainActivity strekker ActionBarActivity {Vehicle kjøretøy; Override Beskyttet void onCreate (Bundle savedInstanceState) {super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); VehicleComponent komponent = Dagger_VehicleComponent.builder () vehicleModule (ny VehicleModule ()) bygge ()..; kjøretøy = component.provideVehicle (); Toast.makeText (dette, String.valueOf (vehicle.getSpeed ()), Toast.LENGTH_SHORT) .vis (); }}
Konklusjon