2010-10-24 66 views
33

假設我有一個名爲SocialNetworkService的接口,並且有三個實現 - TwitterService,FacebookServiceFriendFeedService在CDI中注入對象列表(焊接)

現在,我希望每當我的託管bean(或任何Web組件)收到消息時,在所有社交網絡中共享它。我試過:

@Inject private List<SocialNetworkService> socialNetworkServices; 

但它沒有工作(部署錯誤)。 (也試圖@Any限定符 - 相同的結果)

那麼,有沒有辦法注入一個接口的所有(或一些)實現列表?

我知道給定注入點不應該有多於一個可能的bean的規則。我想我可以通過製作一個製作列表的製作人來實現這個目標,並且使用Instance<SocialNetworkService>,但是對於這個任務來說似乎太多了。

+0

想留純JSR-330? – 2010-10-24 17:38:42

+0

330和299 ..這應該是足夠的 – Bozho 2010-10-24 17:41:18

回答

55

結合我嘗試從焊接論壇回答:

@Inject @Any 
private Instance<SocialNetworkService> services; 

Instance實現Iterable,那麼則有可能簡單地使用for-each循環。需要@Any限定符。


另一種方式做,這是通過使用事件系統:

  • 創建MessageEvent(包含所有有關郵件的信息)
  • ,而不是注入社交網絡的列表,簡單地注入事件:

    @Inject private Event<MessageEvent> msgEvent; 
    

    ,並啓動它:msgEvent.fire(new MessageEvent(message));

  • 觀察所有服務(無論其接口有加,這可能是)事件:

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

有趣的(+1) – 2010-11-14 13:50:38

+2

+1這將進入我的CDI反模式列表! – Tair 2011-10-08 08:27:48

+0

@tiar - 爲什麼反模式? – Bozho 2011-10-08 08:50:47

0

我看了一下JSR-299規範,看起來你可以很容易地做你想做的事情,而且我沒有足夠的經驗來爲Weld提供這種特殊情況的代碼。但是,根據第12.3章「Bean發現」,您可以將實現聲明爲@ Alternative's(以避免Weld抱怨多個實現),並在發現SocialNetworkService的實現時收聽ProcessBean事件以收集事件。

+0

比我最初的建議更加乏味。不管怎麼說,還是要謝謝你。 – Bozho 2010-10-24 18:19:48

+0

最初的建議仍然需要知道所有的實現 - 焊接不能盡我所能看到告訴你。 – 2010-10-24 19:10:32