30 Juin 2015

L’injection de dépendance sur Android avec Dagger 2

android-penetration-testing

Lors de la Google I/O 15 une nouvelle version de Android Support Testing Library a été annoncée. Cette dernière utilise Dagger 2, la nouvelle librairie d’injection de dépendance créée par Google.

Cet article va vous expliquer comment la mettre en place dans vos projets.

À propos de Dagger 2

Dagger 2 est un fork de Dagger, la librairie d’injection de dépendances développée par Square, par Google. La principale différence de Dagger 2 par rapport à Dagger et les autres bibliothèques d’injection de dépendance est qu’il fonctionne avec du code généré et non plus grâce à la réflexion. Son principe directeur est que le code généré aurait pu être écrit par un développeur, ce qui rend l’injection de dépendance plus simple et plus performante. Pour plus d’informations sur le design de Dagger 2 je vous invite à regarder cette présentation de Gregory Kick.

 

Présentation du fonctionnement de Dagger 2

Modules

Les modules sont responsables de la création et de la configuration des dépendances à injecter grâce à un ensemble de fonctions annotées par @Provides. Il s’agit de classes annotées avec @Module.

Exemple de module :

Que faisons-nous dans ce code ?

@Module identifie la classe comme un module Dagger 2

@Provides identifie la méthode comme un fournisseur pour l’injection. Le nom de la méthode n’est pas important mais la convention veut qu’il commence par provide

@Singleton indique que l’on souhaite utiliser la même référence à chaque fois. Dans notre cas l’annotation n’était pas obligatoire pour provideApplicationContexte puisque l’on ne crée pas de nouvelle instance. Cependant cela permet de comprendre ce que le fournisseur fait.

Composants

Les composants sont utilisés pour grouper et construire les modules en un objet dont on peut obtenir les dépendances et/ou injecter des champs. Il s’agit d’une interface annotée par @Component, à la compilation Dagger 2 générera son implémentation. Un composant doit lister les modules qui le composent ainsi que les composants dont il dépend.

L’interface peut contenir deux types de méthodes :

  • retourne un objet et n’a pas de paramètres : on retourne une instance créée par Dagger 2 et ses dépendances sont résolues par l’injection dans le constructeur
  • retourne void mais à un paramètre : permet de résoudre des dépendances par l’injection dans une propriété non privée. Cela est utile dans un contexte Android parce que l’on ne crée pas certaines instance (par exemple les Activity)

Que faisons-nous dans ce code ?

@Singleton indique que l’on souhaite une seule référence référence du composant dans toute l’application.

Si l’on n’expose pas Context et Bus nous ne pourrons pas les utiliser en dehors de notre composant et il y aura une erreur de compilation.

Injection

Il existe 3 façons d’injecter des dépendances :

  • En appelant directement la dépendance sur le composant
  • En annotant une propriété par @Inject et en appelant composant.inject(object)
  • En annotant le constructeur par @Inject

Scope

Il est possible de créer des scopes pour ses composants. Nous pouvons créer un scope @PerActivity qui permet de lier un composant à une activité.

Assemblons tous les éléments

Installation

Dans votre fichier build.gradle racine ajoutez la dépendance suivante :

Dans votre fichier build.gradle applicatif ajoutez le plugin suivant :

et les dépendences suivantes

Création du graph

Maintenant que vous avez créé votre module et votre composant (voir Présentation du fonctionnement de Dagger 2) vous pouvez créer le graph de dépendance dans votre application.

Injection

Pour injecter vos éléments dans votre activité ou votre fragment Android vous devez utiliser l’injection par propriété.

Share