Panoramica su Dagger2 e i suoi componenti.
Presentazione utilizzata durante il codelab "Sviluppare un'app Android utilizzando il pattern MVP, Dagger2 e RxJava" tenuto in occasione della conferenza GDG Bari Devfest 2016 presso il Politecnico di Bari.
3. Cos’è?
“ Dagger è un framework del tutto statico e a compile time di
dependency injection Java e Android.
Precedentemente sviluppato da Square, è adesso
manutenuto da Google. ”
[ google.github.io/dagger ]
4. Dependency Injection
Dependency injection (DI) è un design pattern della
Programmazione orientata agli oggetti il cui scopo è quello di
semplificare lo sviluppo e migliorare la testabilità di software di
grandi dimensioni.
[ Wikipedia ]
La Dependancy injection è un’implementazione della
“inversione del controllo”, ovvero il concetto per il quale un
componente riceve il controllo da un altro componente esterno
appartenente ad una libreria riutilizzabile, ribaltando di fatto il
concetto tradizionale della programmazione procedurale dove
è il componente attivo a chiamare procedure esterne.
5. Dependency Injection - Esempio
class LoginActivity extends Activity {
private AuthManager authManager;
onCreate(...) {
authManager = new AuthManager(...);
}
onLoginClick() {
authManager.doLogin();
}
Tradizionale: senza DI
class LoginActivity extends Activity {
@Inject
private AuthManager authManager;
onCreate(...) {
}
onLoginClick() {
authManager.doLogin();
}
Dagger2: con DI
6. Dagger API
@Module & @Provides Forniscono dipendenze
@Inject Richiede dipendenze
@Component Ponte tra moduli e inject
7. Fornire Dipendenze
I Moduli sono classi i quali metodi forniscono dipendenze:
@Module sulla classe
@Provides su ogni metodo
8. Esempio @Module + @Provides
public class NetworkModule {
OkHttpClient provideOkHttpClient() {
return new OkHttpClient();
}
TwitterApi provideTwitterApi(OkHttpClient client) {
return new TwitterApi(client);
}
}
@Module
@Provides
@Provides
@Singleton
@Singleton
9. Constructor Injection
@Inject su un singolo costruttore (all’interno della classe)
I parametri del costruttore sono dipendenze
Le dipendenze possono essere memorizzate
in campi final e private
10. Esempio - Constructor Injection
public class TwitterApplication {
private final Tweeter tweeter;
private final Timeline timeline;
@Inject
public TwitterApplication(Tweeter tweeter, Timeline timeline)
{
this.tweeter = tweeter;
this.timeline = timeline;
}
// …
11. Field Injection
@Inject sugli attributi che sono dipendenze della classe
Gli attributi non devono essere di tipo private o final
12. Esempio - Field Injection
public class TwitterActivity extends Activity {
@Inject Tweeter tweeter;
@Inject Timeline timeline;
// …
}
13. Field Injection
@Inject sugli attributi che sono dipendenze della classe
Gli attributi non devono essere di tipo private o final
L’Injection si verifica solo quando l’oggetto
è completamente istanziato