SlideShare a Scribd company logo
1 of 16
Download to read offline
Dagger 2
Boris D’Amato
Android Developer @
+BorisDAmato
@borisdamato
damatoboris
borisdamato
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 ]
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.
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
Dagger API
@Module & @Provides Forniscono dipendenze
@Inject Richiede dipendenze
@Component Ponte tra moduli e inject
Fornire Dipendenze
I Moduli sono classi i quali metodi forniscono dipendenze:
@Module sulla classe
@Provides su ogni metodo
Esempio @Module + @Provides
public class NetworkModule {
OkHttpClient provideOkHttpClient() {
return new OkHttpClient();
}
TwitterApi provideTwitterApi(OkHttpClient client) {
return new TwitterApi(client);
}
}
@Module
@Provides
@Provides
@Singleton
@Singleton
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
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;
}
// …
Field Injection
@Inject sugli attributi che sono dipendenze della classe
Gli attributi non devono essere di tipo private o final
Esempio - Field Injection
public class TwitterActivity extends Activity {
@Inject Tweeter tweeter;
@Inject Timeline timeline;
// …
}
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
Componente
Ponte tra i moduli e l’injection
E’ l’injector stesso.
Esempio - Component
@Singleton
@Component(modules = {
NetworkModule.class,
TwitterModule.class,
})
public interface TwitterComponent {
Tweeter tweeter();
Timeline timeline();
}
Esempio - Component
TwitterComponent component = DaggerTwitterComponent
.builder()
.networkModule(new NetworkModule())
.twitterModule(new TwitterModule(“Boris D’Amato”))
.build();
Tweeter tweeter = component.tweeter()

More Related Content

Similar to Panoramica su Dagger2 per Android

Dependency injection questa sconosciuta
Dependency injection questa sconosciutaDependency injection questa sconosciuta
Dependency injection questa sconosciutaAndrea Dottor
 
Asp.Net MVC 3 - Il Model View Controller secondo Microsoft
Asp.Net MVC 3 - Il Model View Controller secondo MicrosoftAsp.Net MVC 3 - Il Model View Controller secondo Microsoft
Asp.Net MVC 3 - Il Model View Controller secondo MicrosoftStefano Benedetti
 
Come sfruttare tutte le potenzialità di Symfony in Drupal 8
Come sfruttare tutte le potenzialità di Symfony in Drupal 8Come sfruttare tutte le potenzialità di Symfony in Drupal 8
Come sfruttare tutte le potenzialità di Symfony in Drupal 8Wellnet srl
 
Come sfruttare tutte le potenzialità di Symfony in Drupal 8
Come sfruttare tutte le potenzialità di Symfony in Drupal 8Come sfruttare tutte le potenzialità di Symfony in Drupal 8
Come sfruttare tutte le potenzialità di Symfony in Drupal 8Eugenio Minardi
 
The Hitchhiker's Guide to testable code: semplici regole per scrivere codice ...
The Hitchhiker's Guide to testable code: semplici regole per scrivere codice ...The Hitchhiker's Guide to testable code: semplici regole per scrivere codice ...
The Hitchhiker's Guide to testable code: semplici regole per scrivere codice ...Davide Cerbo
 
Servizi e Dependency Injection in Angular
Servizi e Dependency Injection in AngularServizi e Dependency Injection in Angular
Servizi e Dependency Injection in AngularValerio Como
 
Design Pattern Comportamentali
Design Pattern ComportamentaliDesign Pattern Comportamentali
Design Pattern ComportamentaliRiccardo Cardin
 
Non solo Django: MVC orientato agli oggetti con Plone e Zope Toolkit
Non solo Django: MVC orientato agli oggetti con Plone e Zope ToolkitNon solo Django: MVC orientato agli oggetti con Plone e Zope Toolkit
Non solo Django: MVC orientato agli oggetti con Plone e Zope ToolkitMaurizio Delmonte
 
Qt Lezione4 Parte2: creare un custom widget plugin per Qt Designer
Qt Lezione4 Parte2: creare un custom widget plugin per Qt DesignerQt Lezione4 Parte2: creare un custom widget plugin per Qt Designer
Qt Lezione4 Parte2: creare un custom widget plugin per Qt DesignerPaolo Sereno
 
Closure Visto Da Vicino
Closure Visto Da VicinoClosure Visto Da Vicino
Closure Visto Da Vicinodavide ficano
 
Idiomatic Domain Driven Design
Idiomatic Domain Driven DesignIdiomatic Domain Driven Design
Idiomatic Domain Driven DesignAndrea Saltarello
 
PowerMock TDD User Group Milano
PowerMock TDD User Group MilanoPowerMock TDD User Group Milano
PowerMock TDD User Group MilanoMassimo Groppelli
 
Come portare il profiler di symfony2 in drupal8
Come portare il profiler di symfony2 in drupal8Come portare il profiler di symfony2 in drupal8
Come portare il profiler di symfony2 in drupal8Luca Lusso
 
High specialized vm on open stack cloud
High specialized vm on open stack cloudHigh specialized vm on open stack cloud
High specialized vm on open stack cloudGabriele Baldoni
 
Lezione 6b: Design Pattern Strutturali
Lezione 6b: Design Pattern StrutturaliLezione 6b: Design Pattern Strutturali
Lezione 6b: Design Pattern StrutturaliAndrea Della Corte
 

Similar to Panoramica su Dagger2 per Android (20)

Design Pattern
Design PatternDesign Pattern
Design Pattern
 
Dependency injection questa sconosciuta
Dependency injection questa sconosciutaDependency injection questa sconosciuta
Dependency injection questa sconosciuta
 
Asp.Net MVC 3 - Il Model View Controller secondo Microsoft
Asp.Net MVC 3 - Il Model View Controller secondo MicrosoftAsp.Net MVC 3 - Il Model View Controller secondo Microsoft
Asp.Net MVC 3 - Il Model View Controller secondo Microsoft
 
Corso angular js componenti
Corso angular js componentiCorso angular js componenti
Corso angular js componenti
 
Come sfruttare tutte le potenzialità di Symfony in Drupal 8
Come sfruttare tutte le potenzialità di Symfony in Drupal 8Come sfruttare tutte le potenzialità di Symfony in Drupal 8
Come sfruttare tutte le potenzialità di Symfony in Drupal 8
 
Come sfruttare tutte le potenzialità di Symfony in Drupal 8
Come sfruttare tutte le potenzialità di Symfony in Drupal 8Come sfruttare tutte le potenzialità di Symfony in Drupal 8
Come sfruttare tutte le potenzialità di Symfony in Drupal 8
 
The Hitchhiker's Guide to testable code: semplici regole per scrivere codice ...
The Hitchhiker's Guide to testable code: semplici regole per scrivere codice ...The Hitchhiker's Guide to testable code: semplici regole per scrivere codice ...
The Hitchhiker's Guide to testable code: semplici regole per scrivere codice ...
 
Servizi e Dependency Injection in Angular
Servizi e Dependency Injection in AngularServizi e Dependency Injection in Angular
Servizi e Dependency Injection in Angular
 
Design Pattern Comportamentali
Design Pattern ComportamentaliDesign Pattern Comportamentali
Design Pattern Comportamentali
 
Non solo Django: MVC orientato agli oggetti con Plone e Zope Toolkit
Non solo Django: MVC orientato agli oggetti con Plone e Zope ToolkitNon solo Django: MVC orientato agli oggetti con Plone e Zope Toolkit
Non solo Django: MVC orientato agli oggetti con Plone e Zope Toolkit
 
Qt Lezione4 Parte2: creare un custom widget plugin per Qt Designer
Qt Lezione4 Parte2: creare un custom widget plugin per Qt DesignerQt Lezione4 Parte2: creare un custom widget plugin per Qt Designer
Qt Lezione4 Parte2: creare un custom widget plugin per Qt Designer
 
Closure Visto Da Vicino
Closure Visto Da VicinoClosure Visto Da Vicino
Closure Visto Da Vicino
 
Idiomatic Domain Driven Design
Idiomatic Domain Driven DesignIdiomatic Domain Driven Design
Idiomatic Domain Driven Design
 
PowerMock TDD User Group Milano
PowerMock TDD User Group MilanoPowerMock TDD User Group Milano
PowerMock TDD User Group Milano
 
Dependency Injection
Dependency InjectionDependency Injection
Dependency Injection
 
Come portare il profiler di symfony2 in drupal8
Come portare il profiler di symfony2 in drupal8Come portare il profiler di symfony2 in drupal8
Come portare il profiler di symfony2 in drupal8
 
Spring 2.5
Spring 2.5Spring 2.5
Spring 2.5
 
High specialized vm on open stack cloud
High specialized vm on open stack cloudHigh specialized vm on open stack cloud
High specialized vm on open stack cloud
 
Lezione 6b: Design Pattern Strutturali
Lezione 6b: Design Pattern StrutturaliLezione 6b: Design Pattern Strutturali
Lezione 6b: Design Pattern Strutturali
 
introduzione a symfony 2
introduzione a symfony 2 introduzione a symfony 2
introduzione a symfony 2
 

Panoramica su Dagger2 per Android

  • 2. Boris D’Amato Android Developer @ +BorisDAmato @borisdamato damatoboris borisdamato
  • 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
  • 14. Componente Ponte tra i moduli e l’injection E’ l’injector stesso.
  • 15. Esempio - Component @Singleton @Component(modules = { NetworkModule.class, TwitterModule.class, }) public interface TwitterComponent { Tweeter tweeter(); Timeline timeline(); }
  • 16. Esempio - Component TwitterComponent component = DaggerTwitterComponent .builder() .networkModule(new NetworkModule()) .twitterModule(new TwitterModule(“Boris D’Amato”)) .build(); Tweeter tweeter = component.tweeter()