Panoramica su Dagger2 per Android

Preview:

Citation preview

Dagger 2

Boris D’AmatoAndroid 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()

Recommended