Pregunta

Vamos a decir que tengo una interfaz llamada SocialNetworkService, y tres implementaciones -. TwitterService, FacebookService y FriendFeedService

Ahora quiero, cada vez que mi bean gestionado (o cualquier componente web) recibe un mensaje, para compartir en todas las redes sociales. Probé:

@Inject private List<SocialNetworkService> socialNetworkServices;

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

Entonces, ¿hay una manera de inyectar una lista de todos (o algunos) implementaciones de una interfaz?

Sé que la regla de que un determinado punto de inyección no debe tener más de un frijol posible. Creo que puedo lograr que al hacer un productor que produce la lista, y el uso de Instance<SocialNetworkService>, pero que parece demasiado para esta tarea.

¿Fue útil?

Solución

Combinar mis intentos con una respuesta del foro Weld:

@Inject @Any
private Instance<SocialNetworkService> services;

implementos Instance Iterable, por lo que es entonces posible utilizar simplemente el-cada uno por bucle. Se necesita el calificador @Any.


Otra manera de hacer esto es mediante el uso del sistema de eventos:

  • crear un MessageEvent (que contiene toda la información acerca del mensaje)
  • en lugar de la inyección de una lista de redes sociales, sólo tiene que inyectar el evento:

    @Inject private Event<MessageEvent> msgEvent;
    

    y el fuego que: msgEvent.fire(new MessageEvent(message));

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

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

Otros consejos

Yo tenía un vistazo a la especificación JSR-299 y no parece que se puede hacer lo que quiere hacer con facilidad y que no tiene experiencia suficiente con autógena a proporcionar el código para este caso especial.

Sin embargo, con base en el capítulo 12.3 "grano de descubrimiento" que podría ser capaz de declarar las implementaciones como @ de Alternative (para evitar soldar quejarse de múltiples implementaciones) y escuchar eventos ProcessBean para recoger cuando se ven las implementaciones de SocialNetworkService.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top