16
Dagger 2

Panoramica su Dagger2 per Android

Embed Size (px)

Citation preview

Page 1: Panoramica su Dagger2 per Android

Dagger 2

Page 2: Panoramica su Dagger2 per Android

Boris D’AmatoAndroid Developer @

+BorisDAmato

@borisdamato

damatoboris

borisdamato

Page 3: Panoramica su Dagger2 per Android

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 ]

Page 4: Panoramica su Dagger2 per Android

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.

Page 5: Panoramica su Dagger2 per Android

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

Page 6: Panoramica su Dagger2 per Android

Dagger API

@Module & @Provides Forniscono dipendenze

@Inject Richiede dipendenze

@Component Ponte tra moduli e inject

Page 7: Panoramica su Dagger2 per Android

Fornire Dipendenze

I Moduli sono classi i quali metodi forniscono dipendenze:

@Module sulla classe

@Provides su ogni metodo

Page 8: Panoramica su Dagger2 per Android

Esempio @Module + @Provides

public class NetworkModule { OkHttpClient provideOkHttpClient() { return new OkHttpClient(); }

TwitterApi provideTwitterApi(OkHttpClient client) { return new TwitterApi(client); }}

@Module

@Provides

@Provides

@Singleton

@Singleton

Page 9: Panoramica su Dagger2 per Android

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

Page 10: Panoramica su Dagger2 per Android

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; } // …}

Page 11: Panoramica su Dagger2 per Android

Field Injection

@Inject sugli attributi che sono dipendenze della classe

Gli attributi non devono essere di tipo private o final

Page 12: Panoramica su Dagger2 per Android

Esempio - Field Injection

public class TwitterActivity extends Activity {

@Inject Tweeter tweeter; @Inject Timeline timeline;

// …}

Page 13: Panoramica su Dagger2 per Android

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

Page 14: Panoramica su Dagger2 per Android

Componente

Ponte tra i moduli e l’injection

E’ l’injector stesso.

Page 15: Panoramica su Dagger2 per Android

Esempio - Component

@Singleton@Component(modules = {

NetworkModule.class,TwitterModule.class,

})public interface TwitterComponent { Tweeter tweeter(); Timeline timeline();}

Page 16: Panoramica su Dagger2 per Android

Esempio - Component

TwitterComponent component = DaggerTwitterComponent.builder().networkModule(new NetworkModule()).twitterModule(new TwitterModule(“Boris D’Amato”)).build();

Tweeter tweeter = component.tweeter()