Question

Disons que j'ai une interface appelée SocialNetworkService et trois implémentations -. TwitterService, FacebookService et FriendFeedService

Maintenant, je veux, quand mon bean géré (ou tout autre composant web) reçoit un message, de le partager dans tous les réseaux sociaux. J'ai essayé:

@Inject private List<SocialNetworkService> socialNetworkServices;

Mais il ne fonctionne pas (erreur de déploiement). (Essayé également à la qualification de @Any - même résultat)

Alors, est-il un moyen d'injecter une liste de tous (ou certaines) mises en œuvre d'une interface?

Je sais que la règle selon laquelle un point d'injection donné ne doit pas avoir plus d'un haricot possible. Je suppose que je peux y parvenir en faisant un producteur qui produit la liste, et en utilisant Instance<SocialNetworkService>, mais cela semble trop pour cette tâche.

Était-ce utile?

La solution

La combinaison de mes tentatives avec une réponse du forum de soudure:

@Inject @Any
private Instance<SocialNetworkService> services;

Instance implémente Iterable, il est alors possible d'utiliser simplement la boucle for-each. Le qualificatif de @Any est nécessaire.


Une autre façon de le faire est en utilisant le système d'événements:

  • créer un MessageEvent (contenant toutes les informations sur le message)
  • au lieu d'injecter une liste des réseaux sociaux, injecter simplement l'événement:

    @Inject private Event<MessageEvent> msgEvent;
    

    et le feu il: msgEvent.fire(new MessageEvent(message));

  • observer l'événement dans tous les services (quelle que soit leur interface, ce qui pourrait être un plus):

    public void consumeMessageEvent(@Observes MessageEvent msgEvent) {..}
    

Autres conseils

J'ai eu un coup d'œil à la spécification JSR-299 et il ne semble pas que vous pouvez faire ce que vous voulez faire facilement et je n'ai pas assez d'expérience avec Weld pour fournir le code pour ce cas particulier.

Cependant, sur la base du chapitre 12.3 « Découverte Bean », vous pourriez être en mesure de déclarer les mises en œuvre comme @ de remplacement (pour éviter se plaindre de soudure sur les multiples implémentations) et écouter les événements ProcessBean pour recueillir lorsque les implémentations de SocialNetworkService sont vus.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top