Injecter liste des objets en CDI (soudure)
-
25-09-2019 - |
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.
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.