Dependența de injecție cu Dagger 2 pe Android

Injectarea de dependență este un model de design software orientat spre a face ca aplicațiile noastre să fie cuplate, extensibile și întreținute. În acest tutorial, veți învăța cum să gestionați injecția de dependență folosind Dagger 2.

Introducere

Când aveți un obiect care are nevoie sau depinde de un alt obiect pentru a-și face munca, aveți o dependență. Dependențele pot fi rezolvate permițând obiectului dependent să creeze dependența sau să ceară unui obiect fabrica să facă una. În contextul injectării dependenței, totuși, dependențele sunt furnizate clasei care are nevoie de dependență pentru a evita nevoia ca clasa însăși să le creeze. În acest fel, creați software care este cuplat slab și foarte bine întreținut.

Acest tutorial folosește cea mai nouă versiune a Dagger, Dagger 2. La momentul scrierii, Dagger 2 nu este încă lansat oficial și este în stadiu prealpha. Cu toate acestea, este utilizabil și stabil. Puteți vizita Dagger pe GitHub pentru a obține știri despre proiect și date posibile pentru lansarea oficială.

Cerințe preliminare

Veți avea nevoie de cea mai recentă versiune de Android Studio instalată pe mașina dvs. de dezvoltare, pe care o puteți descărca de pe site-ul Android Developer.

1. Dagger 2 API

Dagger 2 expune o serie de adnotări speciale:

  • @Modul pentru clasele a căror metode oferă dependențe
  • @Provides pentru metodele din cadrul @Modul clase
  • @Injecta pentru a solicita o dependență (un constructor, un câmp sau o metodă)
  • @Component este o interfață de punte între module și injecție

Acestea sunt cele mai importante adnotări pe care trebuie să le cunoașteți pentru a începe să utilizați injecția de dependență utilizând Dagger 2. Vă voi arăta cum să le utilizați într-o aplicație Android simplă.

2. Fluxul de lucru al Dagger 2

Pentru a implementa corect Dagger 2, trebuie să urmați acești pași:

  1. Identificați obiectele dependente și dependențele acestora.
  2. Creați o clasă cu @Modul adnotare, folosind @Provides adnotare pentru fiecare metodă care returnează o dependență.
  3. Solicitați dependențe în obiectele dependente utilizând @Injecta adnotare.
  4. Creați o interfață utilizând @Component adnotare și adăugați clasele la @Modul adnotarea creată în al doilea pas.
  5. Creați un obiect al @Component interfață pentru a instantiza obiectul dependent cu dependențele acestuia.

Analiza dependenței este deplasată din timpul de execuție pentru a compila timpul. Aceasta înseamnă că vi se comunică posibile probleme în timpul fazei de dezvoltare, spre deosebire de alte biblioteci, cum ar fi Guice. Înainte de a utiliza biblioteca Dagger 2, trebuie să vă pregătiți instalarea Android Studio pentru a accesa clasele generate.

3. Setarea pentru mediul Android Studio

Pasul 1

Creați o aplicație nouă utilizând Android Studio și dați-i un nume. Am numit proiectul meu TutsplusDagger.

Pasul 2

Seteaza SDK minim pentru ca proiectul să API 10 pentru a ajunge la cât mai multe dispozitive posibil.

Pasul 3

Alege Gol aspect pentru activitatea pe care o creați. Pentru acest tutorial, nu aveți nevoie de un aspect special.

Pasul 4

Denumiți activitatea Activitate principala și faceți clic pe finalizarea.

Cu proiectul creat, trebuie să efectuați câteva modificări la fișierele de gradare. Să facem aceste schimbări în pasul următor.

4. Configurarea setării gradului

Pasul 1

Trebuie să modificăm proiectul build.gradle fișier după cum se arată mai jos.

construiți repositories jcenter () dependencies classpath 'com.android.tools.build:gradle:1.0.0' classpath 'com.neenbedankt.gradle.plugins: android-apt: 1.4' allprojects repositories mavenCentral ) maven url 'https://oss.sonatype.org/content/repositories/snapshots/'

Să luăm o clipă pentru a vedea ce schimbări am făcut:

  • dependențe: În această secțiune, am adăugat un plugin care va fi util pentru accesarea codului generat de Dagger. Dacă nu, veți vedea erori atunci când vă referiți la aceste clase noi.
  • allprojects: Această modificare este necesară deoarece bibliotecile pe care le vom folosi sunt în prezent în pre-alfa și acesta este singurul loc disponibil dacă doriți să le accesați utilizând Maven. Puteți încerca să descărcați bibliotecile Dagger și Dagger Compiler de la Sonatype, dar acest tutorial se bazează pe arhivele Maven.

Pasul 2

Deschis build.gradle în folderul de aplicații al proiectului și modificați-l după cum se arată mai jos.

aplicați pluginul: 'com.android.application' aplicați pluginul: 'com.neenbedankt.android-apt' șiroid compileSdkVersion 21 buildToolsVersion "21.1.2" defaultConfig applicationId "com.androidheroes.tutsplusdagger" minSdkVersion 10 targetSdkVersion 21 versionCode 1 versionName " 1.0 " buildTypes release minifyEnabled false proguardFiles getDefaultProguardFile ('proguard-android.txt', 'proguard-rules.pro' dependente compile fileTree (dir: 'libs' ]) compilați 'com.android.support:appcompat-v7:21.0.3' compilați 'com.google.dagger: dagger: 2.0-SNAPSHOT' apt 'com.google.dagger: dagger-compiler: 2.0-SNAPSHOT' org.glassfish: javax.annotation: 10.0-b28 '

La începutul fișierului, utilizez noul plugin. Asigurați-vă că ați pus pluginul nou (com.neenbedankt.android-apt) de mai jos sau după pluginul Android. Dacă nu, atunci se vor afișa erori atunci când se încearcă sincronizarea proiectului cu fișierele de gradare.

În dependențe Am adăugat:

  • pumnal bibliotecă
  • pumnal-compilator pentru generarea de coduri
  • javax.annotation pentru adnotări adiționale necesare în afara Dagger

După actualizarea configurației Dagger, puteți sincroniza proiectul cu fișierele de gradare făcând clic pe butonul din partea de sus.

În acest moment, aveți un proiect gol pregătit pentru a fi utilizat în aplicația dvs. Dacă observați erori, asigurați-vă că ați urmat corect pașii de mai sus. Putem continua să implementăm exemplul nostru de proiect.

5. Punerea în aplicare a Dagger 2

Pasul 1: Identificați obiectele dependente

Pentru acest tutorial, voi lucra cu două clase, Vehicul și Motor. Motor este clasa independentă și Vehiculeste clasa dependentă. Voi începe să creez acest model într-un nou pachet numit model.

Aceasta este ceea ce Motor clasa arata ca:

pachet com.androidheroes.tutsplusdagger.model; / ** * Creat de kerry pe 14/02/15. * / clasa publica Motor private int rpm; public Motor () this.rpm = 0;  public int getRpm () retur rpm;  void publice accelerate (valoarea int) rpm = rpm + value;  void public void () rpm = 0; 

Această clasă are un singur atribut numit rpm, pe care o voi modifica prin accelera și frână metode. Și voi verifica valoarea curentă folosind getRpm metodă.

Aceasta este ceea ce Vehicul clasa arata ca:

pachet com.androidheroes.tutsplusdagger.model; / ** * Creat de kerry pe 14/02/15. * / clasa publica Vehicle motor privat; vehicul public (motor de motor) this.motor = motor;  public void increaseSpeed ​​(valoare int) motor.accelerate (valoare);  public void stop () motor.brake ();  public int getSpeed ​​() retur motor.getRpm (); 

În această clasă, puteți vedea că nu creez un obiect nou al Motor clasa, chiar dacă folosesc metodele sale. Într-o aplicație din lumea reală, această clasă ar trebui să aibă mai multe metode și atribute, dar să o păstrăm simplu pentru moment.

Pasul 2: Creați @Modul Clasă

Acum trebuie să creați o clasă cu @Modul adnotare. Această clasă va oferi obiectele de care aveți nevoie cu dependențele sale satisfăcute. Pentru aceasta, trebuie să creați un nou pachet (doar pentru al menține în ordine), să-l numiți modul și adăugați o nouă clasă în interiorul acesteia, după cum urmează:

pachet 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; / ** * Creat de kerry pe 14/02/15. * / @Module public class VehicleModule @ Oferă @Singleton Motor provideMotor () retur nou Motor ();  @ Oferă @Singleton Vehicle provideVehicle () retur nou vehicul (nou motor ()); 

Așa cum am specificat în Pasul 1,Vehicul are nevoie Motor pentru a funcționa corect. Acesta este motivul pentru care trebuie să creați doi furnizori, unul pentru Motor (modelul independent) și altul pentru Vehicul (indicând dependența acestuia).

Nu uitați că fiecare furnizor (sau metodă) trebuie să aibă @Provides adnotare și clasa trebuie să aibă @Modul adnotare. @Singleton adnotarea indică faptul că va exista doar o singură instanță a obiectului.

Pasul 3: Solicitați dependențe în obiecte dependente

Acum că aveți furnizorii pentru diferitele dvs. modele, trebuie să le solicitați. Doar noi Vehicul are nevoie Motor, trebuie să adăugați @Injecta adnotare în Vehicul constructor după cum urmează:

@ Injectați vehiculul public (motorul motorului) this.motor = motor; 

Puteți utiliza funcția @Injecta adnotare pentru a solicita dependențe în constructor, câmpuri sau metode. În acest caz, păstrez injecția în constructor.

Pasul 4: conectarea @Modules Cu @Injecta

Legătura dintre furnizorul de dependențe, @Modul, și clasele care le cer @Injecta se face folosind @Component, care este o interfață:

pachet com.androidheroes.tutsplusdagger.component; import com.androidheroes.tutsplusdagger.model.Vehicle; import com.androidheroes.tutsplusdagger.module.VehicleModule; import javax.inject.Singleton; import dagger.Component; / ** * Creat de kerry pe 14/02/15. * / @Singleton @Component (modules = VehicleModule.class) interfață publică VehicleComponent Vehicle provideVehicle (); 

Alături de @Component adnotare, trebuie să specificați modulele care vor fi utilizate - în acest caz folosesc VehicleModule, pe care am creat-o mai devreme. Dacă trebuie să utilizați mai multe module, atunci trebuie doar să le adăugați utilizând o virgulă ca separator.

În cadrul interfeței, adăugați metode pentru fiecare obiect de care aveți nevoie și vă va oferi automat unul cu toate dependențele sale satisfăcute. În acest caz, am nevoie doar de Vehicul obiect, motiv pentru care există o singură metodă.

Pasul 5: Utilizarea @Component Interfața pentru obținerea obiectelor

Acum că aveți toate conexiunile gata, trebuie să obțineți o instanță a acestei interfețe și să invoca metodele sale pentru a obține obiectul de care aveți nevoie. O să o pun în aplicare în onCreate metodă în Activitate principala după cum urmează:

pachet com.androidheroes.tutsplusdagger; import șiroid.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; clasa publica MainActivity extinde ActionBarActivity Vehicle vehicle; @Override protejate void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); Componentă componentă a vehiculului = Dagger_VehicleComponent.builder (). VehiculModule (nou VehicleModule ()) build (); vehicul = component.provideVehicle (); Toast.makeText (aceasta, String.valueOf (vehicul.getSpeed ​​()), Toast.LENGTH_SHORT) .show (); 

Când încercați să creați un obiect nou al interfeței cu @Component adnotare, trebuie să o faceți folosind prefixul Pumnal_, în acest caz Dagger_VehicleComponent, și apoi utilizați constructor metodă pentru a apela fiecare modul în cadrul acestuia.

Puteți vedea că magia are loc pe linia 23. Solicitați doar un obiect al clasei Vehiculiar biblioteca este cea care se ocupă de satisfacerea tuturor dependențelor de care are nevoie acest obiect. Din nou, puteți vedea că nu există nici o instanțiere nouă a vreunui alt obiect - totul este gestionat de bibliotecă.

Acum puteți rula aplicația și o puteți încerca pe dispozitiv sau într-un emulator. Dacă ați urmat tutorialul pas cu pas, veți vedea a Paine prajita mesaj care indică valoarea inițială sau rpm variabil.

În proiectul atașat, puteți vedea o interfață personalizată pentru utilizator Activitate principala clasa în care puteți modifica valoarea rpm variabil prin atingerea butoanelor de pe ecran.

Concluzie

Injectarea de dependență este un model pe care va trebui să-l implementați mai devreme sau mai târziu în propriile aplicații. Cu Dagger 2, aveți o bibliotecă ușor de folosit pentru ao implementa. Sper că ați găsit acest tutorial utile și nu uitați să le împărtășiți dacă v-ați plăcut.

O modalitate foarte bună de a vă îmbunătăți ca dezvoltator Android este de a utiliza șabloane de aplicații Android pentru a vă începe proiectele. Puteți găsi șabloane pentru jocuri sau alte aplicații, elemente de interfață individuală și multe altele.

Sau dacă doriți ceva complet personalizat conform specificațiilor dvs., puteți angaja un dezvoltator Android de pe Envato Studio pentru a face ceva de la tweaks și bug-uri la crearea unei aplicații întregi de la zero.

Cod