2010-10-24 12 views
33

Digamos que tengo una interfaz llamada SocialNetworkService, y tres implementaciones: TwitterService, FacebookService y FriendFeedService.Inyectar lista de objetos en CDI (Weld)

Ahora quiero, siempre que mi bean administrado (o cualquier componente web) reciba un mensaje, para compartirlo en todas las redes sociales. Intenté:

@Inject private List<SocialNetworkService> socialNetworkServices; 

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

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

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

+0

desea permanecer pura JSR-330? –

+0

330 y 299. Eso debería ser suficiente – Bozho

Respuesta

55

Combinando mis intentos con una respuesta del foro Weld:

@Inject @Any 
private Instance<SocialNetworkService> services; 

Instance implementa Iterable, por lo que es posible, entonces, utilizar simplemente el bucle for-cada. El calificador @Any es necesario.


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 inyectar una lista de las redes sociales, simplemente inyectar el evento:

    @Inject private Event<MessageEvent> msgEvent; 
    

    y disparar: 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) {..} 
    
+0

Interesante (+1) –

+2

+1 ¡Esto irá a mi lista de CDI antipatrones! – Tair

+0

@tiar - ¿por qué anti-patrones? – Bozho

0

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

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

+0

que sería aún más tedioso que la sugerencia inicial. Gracias de cualquier manera. – Bozho

+0

La sugerencia inicial aún necesita saber sobre todas sus implementaciones. Weld no puede decir lo que puedo ver. –

Cuestiones relacionadas