Inyectar lista de objetos en CDI (Soldadura)


Digamos que tengo una interfaz llamada SocialNetworkService, y tres implementaciones - TwitterService, FacebookService y FriendFeedService.

Ahora quiero, cada vez que mi bean administrado (o cualquier componente web) reciba un mensaje, compartirlo en todas las redes sociales. Lo intenté:

@Inject private List<SocialNetworkService> socialNetworkServices;

Pero no funcionó (error de implementación). (También intentó el calificador @Any - mismo resultado)

Entonces, ¿hay alguna manera de inyectar una lista de todas (o algunas) implementaciones de una interfaz?

Conozco la regla de que un determinado punto de inyección no debe tener más de un frijol posible. Supongo que puedo lograr eso haciendo un productor que produce la lista, y usando Instance<SocialNetworkService>, pero eso parece demasiado para esta tarea.

Author: Bozho, 2010-10-24

2 answers

Combinando mis intentos con una respuesta del foro Weld:

@Inject @Any
private Instance<SocialNetworkService> services;

Instance implementa Iterable, por lo que es posible usar simplemente el bucle for-each. Se necesita el calificador @Any.


Otra forma de hacer esto es usando el sistema de eventos:

  • crear un MessageEvent (que contenga toda la información sobre el mensaje)
  • En lugar de inyectar una lista de redes sociales, simplemente inyecte el evento:

    @Inject private Event<MessageEvent> msgEvent;
    

    Y fuego: msgEvent.fire(new MessageEvent(message));

  • Observe el evento en todos los servicios (independientemente de su interfaz, que podría ser un plus):

    public void consumeMessageEvent(@Observes MessageEvent msgEvent) {..}
    
 59
Author: Bozho,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-10-25 06:11:25

Eché un vistazo a la especificación JSR-299 y no parece que pueda hacer lo que desea hacer fácilmente y no tengo experiencia suficiente con Weld para proporcionar código para este caso especial.

Sin embargo, basado en el capítulo 12.3 "Bean Discovery" puede ser capaz de declarar las implementaciones como @Alternative (para evitar que Weld se queje de múltiples implementaciones) y escuchar los eventos ProcessBean para recopilar cuando se vean implementaciones de SocialNetworkService.

 0
Author: Thorbjørn Ravn Andersen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-10-24 18:18:16