Domanda

dire Let Ho un'interfaccia chiamata SocialNetworkService, e tre implementazioni -. TwitterService, FacebookService e FriendFeedService

Ora voglio, ogni volta che la mia bean gestito (o qualunque componente Web) riceve un messaggio, per condividere in tutti i social network. Ho provato:

@Inject private List<SocialNetworkService> socialNetworkServices;

Ma non ha funzionato (errore di distribuzione). (Provato anche per il qualificatore @Any - stesso risultato)

Quindi, c'è un modo per iniettare un elenco di tutti (o alcuni) implementazioni di un'interfaccia?

I conosce la regola che un dato punto di iniezione non dovrebbe avere più di un fagiolo possibile. Credo di poter raggiungere questo facendo un produttore che produce la lista, e l'utilizzo di Instance<SocialNetworkService>, ma che sembra troppo per questo compito.

È stato utile?

Soluzione

La combinazione i miei tentativi con una risposta dal forum Weld:

@Inject @Any
private Instance<SocialNetworkService> services;

attrezzi Instance Iterable, quindi è quindi possibile utilizzare semplicemente la per-ogni ciclo. è necessaria la qualificazione @Any.


Un altro modo per farlo è quello di utilizzare il sistema di eventi:

  • creare un MessageEvent (contenente tutte le informazioni relative al messaggio)
  • invece di iniettare un elenco dei social network, è sufficiente iniettare l'evento:

    @Inject private Event<MessageEvent> msgEvent;
    

    e il fuoco è: msgEvent.fire(new MessageEvent(message));

  • osservare l'evento in tutti i servizi (a prescindere dalla loro interfaccia, che potrebbe essere un plus):

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

Altri suggerimenti

Ho avuto uno sguardo alla specifica JSR-299 e non sembra che si può fare ciò che si vuole fare in modo semplice e io non ho abbastanza esperienza con saldatura di fornire il codice per questo caso speciale.

Tuttavia, sulla base capitolo 12.3 "Bean Discovery" si potrebbe essere in grado di dichiarare le implementazioni come @ di alternativa (per evitare di saldare lamentarsi implementazioni multiple) e ascoltare eventi ProcessBean per raccogliere quando implementazioni di SocialNetworkService sono visti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top