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()