Frage

Lassen Sie uns sagen, ich habe eine Schnittstelle namens SocialNetworkService und drei Implementierungen -. TwitterService, FacebookService und FriendFeedService

Jetzt möchte ich, wenn mein Managed Bean (oder was auch immer Web-Komponente) eine Nachricht erhält, ist es in allen sozialen Netzwerken zu teilen. Ich habe versucht:

@Inject private List<SocialNetworkService> socialNetworkServices;

Aber es hat nicht funktioniert (Deployment-Fehler). (Auch versucht, den @Any Qualifier - gleiches Ergebnis)

So ist es eine Möglichkeit, eine Liste aller (oder einiger) Implementierungen einer Schnittstelle zu injizieren?

Ich kenne die Regel, dass eine gegebene Injektionsstelle nicht mehr als eine mögliche Bohne haben sollte. Ich denke, ich kann das erreichen, indem er einen Produzenten zu machen, den die Liste erzeugt, und mit Instance<SocialNetworkService>, aber das scheint, wie zu viel für diese Aufgabe.

War es hilfreich?

Lösung

Die Kombination von meinen Versuchen mit einer Antwort aus dem Weld Forum:

@Inject @Any
private Instance<SocialNetworkService> services;

Instance implementiert Iterable, so dass es dann möglich ist, einfach zu verwenden, die für-jede Schleife. Die @Any Qualifier benötigt wird.


Eine andere Möglichkeit, dies zu tun ist durch das Ereignissystem mit:

  • erstellen MessageEvent (alle Informationen über die Nachricht enthält)
  • statt eine Liste von sozialen Netzwerken Injektion einfach inject Ereignis:

    @Inject private Event<MessageEvent> msgEvent;
    

    und Feuer es: msgEvent.fire(new MessageEvent(message));

  • beachten Sie die Veranstaltung in allen Dienstleistungen (unabhängig von ihrer Schnittstelle, das ist ein Plus sein könnte):

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

Andere Tipps

hatte ich einen Blick auf der JSR-299-Spezifikation und es scheint nicht, dass Sie das tun können, was Sie leicht tun wollen und ich Erfahrung genug, um nicht mit Weld hat Code für diesen speziellen Fall zu schaffen.

Allerdings basiert auf Kapitel 12.3 „Bean Entdeckung“ Sie die Implementierungen als @ Alternative ist zu erklären, vielleicht in der Lage (zur Vermeidung von Schweiß über mehrere Implementierungen beschweren) und ProcessBean Ereignisse hören zu sammeln, wenn Implementierungen von SocialNetworkService gesehen werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top