example - java dependency injection frameworks
Inyectar la lista de objetos en CDI(Weld) (2)
Digamos que tengo una interfaz llamada SocialNetworkService
y tres implementaciones: TwitterService
, FacebookService
y FriendFeedService
.
Ahora quiero, siempre que mi bean administrado (o cualquier componente web) reciba un mensaje, para compartirlo en todas las redes sociales. Lo intenté:
@Inject private List<SocialNetworkService> socialNetworkServices;
Pero no funcionó (error de despliegue). (También se intentó con el calificador @Any
- el 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 dado no debe tener más de un frijol posible. Supongo que puedo lograrlo creando un productor que produzca la lista y utilizando Instance<SocialNetworkService>
, pero eso parece demasiado para esta tarea.
Combinando mis intentos con una respuesta del foro de Weld:
@Inject @Any
private Instance<SocialNetworkService> services;
Instance
implementa Iterable
, por lo que es posible usar simplemente el ciclo for-each. El calificador @Any
es necesario.
Otra forma de hacerlo es mediante el uso del sistema de eventos:
- crear un
MessageEvent
(que contiene toda la información sobre el mensaje) en lugar de inyectar una lista de redes sociales, simplemente inserte el evento:
@Inject private Event<MessageEvent> msgEvent;
y
msgEvent.fire(new MessageEvent(message));
: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) {..}
Eché 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, según el capítulo 12.3 "Descubrimiento de frijoles", podría declarar las implementaciones como @ Alternativas (para evitar que Weld se queje de las múltiples implementaciones) y escuchar los eventos de ProcessBean para recopilar cuando se vean implementaciones de SocialNetworkService.