42 votes

Méthode d'injection utilisant Dagger 2

Je n'ai pas réussi à trouver une bonne explication/exemple sur la méthode d'injection à l'aide de la Dague à 2. Quelqu'un pourrait-il svp m'aider à comprendre?

Exemple:

@Inject
public Dinner makeDinner(Pasta pasta, Sauce sauce) {
    mPan.add(pasta);
    mPan.add(sauce);
    return mPan.cookDinner();
}

Donc, si je annoter ma méthode avec @Inject, ai-je raison de supposer que les arguments de la signature de la méthode sera injecté avec des objets définis à partir de l'objet graphique? Comment puis-je utiliser cette méthode dans mon code alors? Il faudra encore attendre de moi de fournir tous les arguments, quand je fais l'appel de la méthode, qui genre de défaites le but.

Mise à JOUR:

Donc, à partir de ce que je comprends le Dîner objet sera disponible que si je l'appelle, DinnerComponent.dinner(), en supposant que ma DinnerComponent est mis en place comme ceci:

@Component(modules = DinnerModule.class)
public interface DinnerComponent {
    Dinner dinner();
}

et mon DinnerModule est mis en place comme ceci:

@Module
public class DinnerModule {
    public DinnerModule() {}

    @Provides
    Pasta providePasta() { return new Pasta(); }

    @Provides
    Sauce provideSauce() { return new Sauce(); }
}

Ce qui se passe si je veux que mon dîner frit? Donc, nous allons introduire cette méthode:

@Inject
public Dinner makeDinner(Pasta pasta, Sauce sauce) {
    mPan.add(pasta);
    mPan.add(sauce);
    return mPan.fryDinner();
}

Comment puis-je spécifier au sein de la composante dont le dîner est qui?

51voto

Jeff Bowman Points 9712

Une différence fondamentale sur la méthode d'injection qui diffère de la manière dont vous semblez être à l'aide de c'est que la méthode d'injection est juste une autre façon pour la Dague à envoyer dans les dépendances lors de la construction ou de l'injection d'un DI-prêt de l'objet, ce qui signifie que @Inject-annoté méthodes sont destinés à être appelé par le Poignard à la fois sur la construction et non pas de l'intérieur de votre propre code. De ce fait, il est très très peu probable que vous le feriez @Inject-annoter makeDinner, fryDinner, ou toute autre méthode significative des effets secondaires ou des valeurs de retour. Au lieu de cela, le traiter de la méthode d'injection en tant que post-facto occasion pour le constructeur de style injection.

public class Chef {
  private Provider<Pasta> mPastaProvider;
  private Sauce mSauce;

  @Inject
  public void registerIngredients(     // can be named anything
      Provider<Pasta> pastaProvider,
      Sauce sauce) {                   // T and Provider<T> both work, of course
    mPastaProvider = pastaProvider;
    mSauce = sauce;
  }

  /* Non-@Inject */ public Dinner cookDinner() {
    mPan.add(mPastaProvider.get());
    mPan.add(mSauce);
    return mPan.cookDinner();
  }

  /* Non-@Inject */ public Dinner fryDinner() {
    mPan.add(mPastaProvider.get());
    mPan.add(mSauce);
    return mPan.fryDinner();
  }
}

Dans ce cas, lorsque vous demandez de l'injection d'un Chef, la Dague va voir le @Inject-méthode annotée et de l'appeler. Sauf si vous avez un @Inject-annoté constructeur ou @Fournit la méthode, vous ne serez pas en mesure d'obtenir un Chef directement à partir de votre Composant, mais vous pourriez créer un void méthode sur le Composant qui reçoit une construite Chef de l'instance et qui utilise le champ et la méthode d'injection de prévoir que le Chef avec les ingrédients (ou de l'ingrédient Fournisseurs) ils peuvent avoir besoin. (Voir l' @Composant et MembersInjector docs pour plus de détails.)

Notez que, dans aucun cas, ne Dinner apparaissent sur l'objet graphique! L'ajout de @Injecter à un constructeur indique Poignard qu'il peut utiliser que le constructeur de l'objet disponible sur l'objet graphique, mais en ajoutant @Inject une méthode ou un champ simplement dit Dague dans le cadre du processus d'injection, il doit remplir ce champ ou appelez la méthode avec les dépendances. Si vous voulez faire un Dîner disponible sur l'objet graphique, vous aurez besoin de @Inject-annoter le Dîner constructeur, ou mettre un @Fournit ou @Lie méthode sur un Module que vous nourrissez dans le Composant.

Pourquoi voudriez-vous utiliser? Prenons le cas où les objets sont créés reflectively (par exemple, des Activités, des Fragments, et des Vues de Android, ou des objets Sérialisables), où vous préférez ne pas exposer @Inject champs. Dans ces cas, vous pourriez contourner constructeur de contraintes en ayant votre injection d'arriver sur un terrain. De même, si je n'ai pas essayé cette option, vous pouvez prendre avantage de la hiérarchie de classe à l'occasion d'une méthode d'interface avec @Inject, veiller à ce que si oui ou non vous êtes dans une DI contexte, vous pouvez passer certaines dépendances d'un objet dans le cadre de leur préparation.

16voto

Egor Neliuba Points 10286

L'annotation d'une méthode @Inject donne Poignard instructions pour exécuter cette méthode à droite après l'objet de la création - juste après l'appel du constructeur. Ceci est utile lorsque vous avez besoin d'un entièrement construite objet pour quelque chose. Il est un exemple de méthode d'injection dans cet article.

Vous avez raison en disant que cette méthode de paramètres seront fournis par le Poignard, c'est pourquoi vous n'êtes pas censé appeler cette méthode par vous-même.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X