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.
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ă.
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.
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țieAcestea 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ă.
Pentru a implementa corect Dagger 2, trebuie să urmați acești pași:
@Modul
adnotare, folosind @Provides
adnotare pentru fiecare metodă care returnează o dependență.@Injecta
adnotare.@Component
adnotare și adăugați clasele la @Modul
adnotarea creată în al doilea pas.@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.
Creați o aplicație nouă utilizând Android Studio și dați-i un nume. Am numit proiectul meu TutsplusDagger.
Seteaza SDK minim pentru ca proiectul să API 10 pentru a ajunge la cât mai multe dispozitive posibil.
Alege Gol aspect pentru activitatea pe care o creați. Pentru acest tutorial, nu aveți nevoie de un aspect special.
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.
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:
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:
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.
Pentru acest tutorial, voi lucra cu două clase, Vehicul
și Motor
. Motor
este clasa independentă și Vehicul
este 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.
@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.
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.
@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ă.
@Component
Interfața pentru obținerea obiectelorAcum 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 Vehicul
iar 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.
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.