Dépendance Injection With Dagger 2 sur Android

L'injection de dépendance est un modèle de conception logicielle visant à rendre nos applications couplées, extensibles et faciles à maintenir. Dans ce didacticiel, vous apprendrez à gérer l’injection de dépendance à l'aide de Dagger 2..

introduction

Lorsque vous avez un objet qui a besoin d'un autre objet ou qui en dépend pour faire son travail, vous avez une dépendance. Les dépendances peuvent être résolues en laissant l'objet dépendant créer la dépendance ou en demandant à un objet fabrique d'en créer une. Dans le contexte de l'injection de dépendance, cependant, les dépendances sont fournies à la classe qui en a besoin pour éviter que la classe elle-même n'ait à les créer. De cette façon, vous créez un logiciel faiblement couplé et hautement maintenable..

Ce didacticiel utilise la dernière version de Dagger, Dagger 2. Au moment de la rédaction de ce document, Dagger 2 n’est pas encore officiellement publié et est en phase pré-alpha. Cependant, il est utilisable et stable. Vous pouvez visiter Dagger sur GitHub pour avoir des nouvelles du projet et des dates possibles pour la sortie officielle..

Conditions préalables

Vous aurez besoin de la dernière version d'Android Studio installée sur votre ordinateur de développement, que vous pouvez télécharger depuis le site Web d'Android Developer..

1. API Dagger 2

La dague 2 expose un certain nombre d'annotations spéciales:

  • @Module pour les classes dont les méthodes fournissent des dépendances
  • @Provides pour les méthodes à l'intérieur @Module Des classes
  • @Injecter demander une dépendance (un constructeur, un champ ou une méthode)
  • @Composant est une interface de pont entre les modules et l'injection

Ce sont les annotations les plus importantes à connaître pour démarrer avec l'injection de dépendance à l'aide de Dagger 2. Je vais vous montrer comment les utiliser dans une simple application Android..

2. Workflow Dagger 2

Pour implémenter Dagger 2 correctement, vous devez suivre ces étapes:

  1. Identifier les objets dépendants et ses dépendances.
  2. Créer une classe avec le @Module annotation, en utilisant le @Provides annotation pour chaque méthode qui retourne une dépendance.
  3. Demander des dépendances dans vos objets dépendants à l'aide du @Injecter annotation.
  4. Créer une interface en utilisant le @Composant annotation et ajouter les classes avec le @Module annotation créée à la deuxième étape.
  5. Créer un objet de la @Composant interface pour instancier l'objet dépendant avec ses dépendances.

L'analyse des dépendances est décalée du temps d'exécution au temps de compilation. Cela signifie que vous êtes averti des problèmes éventuels pendant la phase de développement, contrairement à d'autres bibliothèques, telles que Guice. Avant d'utiliser la bibliothèque Dagger 2, vous devez préparer votre installation Android Studio pour accéder aux classes générées..

3. Configuration de l'environnement Android Studio

Étape 1

Créez une nouvelle application à l'aide d'Android Studio et nommez-la. J'ai nommé mon projet TutsplusDagger.

Étape 2

Met le SDK minimum pour le projet API 10 pour atteindre autant d'appareils que possible.

Étape 3

Choisir la Blanc mise en page pour l'activité que vous créez. Pour ce tutoriel, vous n'avez pas besoin d'une mise en page spéciale.

Étape 4

Nommez l'activité Activité principale et cliquez terminer.

Une fois le projet créé, vous devez apporter quelques modifications aux fichiers de gradation. Faisons ces changements dans la prochaine étape.

4. Configuration de Gradle Setup

Étape 1

Nous devons modifier le projet build.gradle fichier comme indiqué ci-dessous.

buildscript repositories jcenter () dépendances classpath 'com.android.tools.build:gradle:1.0.0' classpath 'com.neenbedankt.gradle.plugins: android-apt: 1.4' toutprojects repositories mavenCentral ( ) maven url 'https://oss.sonatype.org/content/repositories/snapshots/'

Prenons un instant pour voir quels changements nous avons apportés:

  • dépendances: Dans cette section, j'ai ajouté un plugin utile pour accéder au code généré par Dagger. Si vous ne le faites pas, vous verrez des erreurs en faisant référence à ces nouvelles classes.
  • tous les projets: Cette modification est nécessaire car les bibliothèques que nous allons utiliser sont actuellement en pré-alpha et qu’il s’agit du seul emplacement disponible si vous souhaitez y accéder à l’aide de Maven. Vous pouvez essayer de télécharger les bibliothèques Dagger et Dagger Compiler à partir de Sonatype, mais ce tutoriel est basé sur les référentiels Maven..

Étape 2

Ouvrir build.gradle dans le dossier d'applications de votre projet et modifiez-le comme indiqué ci-dessous.

apply plugin: 'com.android.application' apply plugin: 'com.neenbedankt.android-apt' android compileSdkVersion 21 buildToolsVersion "21.1.2" defaultConfig applicationId "com.androidheroes.tutsplusdagger" minSdkVersion 10 versionSite 21 1.0 " buildTypes release minifyEnabled false proguardFiles getDefaultProguardFile ('proguard-android.txt'), 'proguard-rules.pro' dépendances compiler fileTree (dir: 'libs', include: ['* .jar'] ]) compiler 'com.android.support:appcompat-v7:21.0.3' compiler 'com.google.dagger: dagger: 2.0-SNAPSHOT' apt 'com.google.dagger: compilateur de dagues: 2.0-SNAPSHOT' fourni ' org.glassfish: javax.annotation: 10.0-b28 '

Au début du fichier, j'applique le nouveau plugin. Assurez-vous de mettre le nouveau plugin (com.neenbedankt.android-apt) ci-dessous ou après le plugin Android. Si vous ne le faites pas, des erreurs apparaîtront lors de la synchronisation du projet avec les fichiers de gradation..

Dans les dépendances J'ai ajouté:

  • poignard bibliothèque
  • dague compilateur pour la génération de code
  • javax.annotation pour les annotations supplémentaires requises en dehors de Dagger

Après avoir mis à jour la configuration de Dagger, vous pouvez synchroniser le projet avec les fichiers de gradation en cliquant sur le bouton en haut..

À ce stade, vous avez un projet vide prêt à être utilisé dans votre application. Si vous voyez des erreurs, assurez-vous que vous avez correctement suivi les étapes ci-dessus. Nous pouvons maintenant procéder à la mise en œuvre de notre exemple de projet.

5. Mise en œuvre de la dague 2

Étape 1: Identifier les objets dépendants

Pour ce tutoriel, je vais travailler avec deux classes, Véhicule et Moteur. Moteur est la classe indépendante et Véhiculeest la classe dépendante. Je vais commencer à créer ce modèle dans un nouveau package appelé modèle.

C'est ce que le Moteur la classe ressemble à:

package com.androidheroes.tutsplusdagger.model; / ** * Créé par kerry le 14/02/15. * / public class Motor private int rpm; moteur public () this.rpm = 0;  public int getRpm () return rpm;  public void accelerate (valeur int) rpm = rpm + valeur;  frein vide public () rpm = 0; 

Cette classe a un seul attribut appelé rpm, que je vais modifier à travers le accélérer et frein méthodes. Et je vais vérifier la valeur actuelle en utilisant le getRpm méthode.

C'est ce que le Véhicule la classe ressemble à:

package com.androidheroes.tutsplusdagger.model; / ** * Créé par kerry le 14/02/15. * / public class Vehicle moteur privé; Véhicule public (moteur) this.motor = motor;  public void augmentationSpeed ​​(valeur int) motor.accelerate (valeur);  public void stop () motor.brake ();  public int getSpeed ​​() return motor.getRpm (); 

Dans cette classe, vous pouvez voir que je ne crée pas un nouvel objet du Moteur classe, même si j'utilise ses méthodes. Dans une application du monde réel, cette classe devrait avoir plus de méthodes et d'attributs, mais restons simples pour l'instant.

Étape 2: Créer @Module Classe

Vous devez maintenant créer une classe avec le @Module annotation. Cette classe va fournir les objets dont vous aurez besoin avec ses dépendances satisfaites. Pour cela, vous devez créer un nouveau paquet (juste le garder en ordre), nommez-le module et ajoutez une nouvelle classe à l'intérieur comme suit:

package com.androidheroes.tutsplusdagger.module; import com.androidheroes.tutsplusdagger.model.Motor; import com.androidheroes.tutsplusdagger.model.Vehicle; importer javax.inject.Singleton; importer poignard.Module; importer poignard.Provides; / ** * Créé par kerry le 14/02/15. * / @Module public class VehicleModule @Provides @Singleton Motor fourMotor () return new Motor ();  @Provides @Singleton Vehicle offerVehicle () return new Vehicle (nouveau moteur ())); 

Comme je l'ai spécifié dans Étape 1,Véhicule Besoins Moteur pour fonctionner correctement. C’est pourquoi vous devez créer deux fournisseurs, un pour Moteur (le modèle indépendant) et un autre pour Véhicule (indiquant sa dépendance).

N'oubliez pas que chaque fournisseur (ou méthode) doit avoir le @Provides annotation et la classe doit avoir le @Module annotation. le @Singleton une annotation indique qu'il n'y aura qu'une seule instance de l'objet.

Étape 3: Demander des dépendances dans des objets dépendants

Maintenant que vous avez les fournisseurs pour vos différents modèles, vous devez les demander. Tout comme Véhicule Besoins Moteur, vous devez ajouter le @Injecter annotation dans le Véhicule constructeur comme suit:

@Inject Public Vehicle (Motor moteur) this.motor = motor; 

Vous pouvez utiliser le @Injecter une annotation pour demander des dépendances dans le constructeur, les champs ou les méthodes. Dans ce cas, je garde l'injection dans le constructeur.

Étape 4: De liaison @Modules Avec @Injecter

La connexion entre le fournisseur de dépendances, @Module, et les classes qui les demandent à travers @Injecter est fabriqué en utilisant @Composant, qui est une interface:

package com.androidheroes.tutsplusdagger.component; import com.androidheroes.tutsplusdagger.model.Vehicle; import com.androidheroes.tutsplusdagger.module.VehicleModule; importer javax.inject.Singleton; importer poignard.Component; / ** * Créé par kerry le 14/02/15. * / @Singleton @Component (modules = VehicleModule.class) interface publique VehicleComponent Vehicle supplyVehicle (); 

À côté de la @Composant annotation, vous devez spécifier quels modules seront utilisés, dans ce cas, j'utilise VehicleModule, que nous avons créé plus tôt. Si vous devez utiliser plus de modules, ajoutez-les simplement en utilisant une virgule comme séparateur.

Dans l'interface, ajoutez des méthodes pour chaque objet dont vous avez besoin et il vous en donnera automatiquement une avec toutes ses dépendances satisfaites. Dans ce cas, je n'ai besoin que d'un Véhicule objet, c'est pourquoi il n'y a qu'une seule méthode.

Étape 5: Utilisation @Composant Interface pour obtenir des objets

Maintenant que toutes les connexions sont prêtes, vous devez obtenir une instance de cette interface et appeler ses méthodes pour obtenir l'objet dont vous avez besoin. Je vais l'implémenter dans le onCreate méthode dans le Activité principale comme suit:

package com.androidheroes.tutsplusdagger; importer android.support.v7.app.ActionBarActivity; importer android.os.Bundle; importer android.widget.Toast; importer com.androidheroes.tutsplusdagger.component.Dagger_VehicleComponent; importer com.androidheroes.tutsplusdagger.component.VehicleComponent; import com.androidheroes.tutsplusdagger.model.Vehicle; import com.androidheroes.tutsplusdagger.module.VehicleModule; public class MainActivity étend ActionBarActivity Véhicule véhicule; @Override protected void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); Composant VehicleComponent = Dagger_VehicleComponent.builder (). VehicleModule (new VehicleModule ()). Build (); véhicule = composant.fournisseurVéhicule (); Toast.makeText (this, String.valueOf (vehicle.getSpeed ​​()), Toast.LENGTH_SHORT) .show (); 

Lorsque vous essayez de créer un nouvel objet de l’interface avec le @Composant annotation, vous devez le faire en utilisant le préfixe Poignard_, dans ce cas Dagger_VehicleComponent, et ensuite utiliser le constructeur méthode pour appeler chaque module dans.

Vous pouvez voir que la magie a lieu à la ligne 23. Vous ne demandez qu’un seul objet de la classe. Véhiculeet la bibliothèque est chargée de satisfaire toutes les dépendances dont cet objet a besoin. Encore une fois, vous pouvez voir qu'il n'y a pas de nouvelle instanciation d'aucun autre objet - tout est géré par la bibliothèque.

Vous pouvez maintenant exécuter l'application et l'essayer sur votre appareil ou dans un émulateur. Si vous avez suivi le tutoriel pas à pas, vous verrez un Pain grillé message indiquant la valeur initiale ou la rpm variable.

Dans le projet attaché, vous pouvez voir une interface utilisateur personnalisée pour le Activité principale classe, dans laquelle vous pouvez modifier la valeur du rpm variable en appuyant sur les boutons sur l'écran.

Conclusion

L'injection de dépendance est un modèle que vous devrez implémenter tôt ou tard dans vos propres applications. Avec Dagger 2, vous disposez d'une bibliothèque facile à utiliser pour l'implémenter. J'espère que vous avez trouvé ce tutoriel utile et n'oubliez pas de le partager si vous l'avez aimé..

Un excellent moyen de progresser en tant que développeur Android consiste à utiliser des modèles d'application Android pour démarrer vos projets. Vous pouvez trouver des modèles de jeux ou d’autres applications, des éléments d’interface utilisateur individuels, etc..

Ou si vous voulez quelque chose de complètement personnalisé selon vos spécifications, vous pouvez engager un développeur Android sur Envato Studio pour faire quelque chose, des ajustements et des corrections de bugs à la création d'une application complète à partir de rien..