40

SocialNetworkServiceと呼ばれるインターフェースと、3 つの実装 - TwitterServiceFacebookServiceおよびがあるとしましょうFriendFeedService

ここで、マネージド Bean (または任意の Web コンポーネント) がメッセージを受信するたびに、それをすべてのソーシャル ネットワークで共有したいと考えています。私は試した:

@Inject private List<SocialNetworkService> socialNetworkServices;

しかし、うまくいきませんでした (展開エラー)。@Any(予選にも挑戦- 同じ結果)

では、インターフェイスのすべて (または一部) の実装のリストを挿入する方法はありますか?

特定の注入ポイントに複数の Bean を含めることはできないというルールを知っています。リストを生成するプロデューサーを作成し、 を使用することでそれを達成できると思いますがInstance<SocialNetworkService>、このタスクには多すぎるようです。

4

2 に答える 2

70

私の試みとWeldフォーラムからの回答を組み合わせる:

@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) {..}
    
于 2010-10-24T21:50:55.317 に答える
0

私は JSR-299 仕様を調べましたが、やりたいことを簡単に実行できるようには見えず、この特殊なケースのコードを提供するのに十分な Weld の経験がありません。

ただし、12.3 章「Bean Discovery」に基づいて、実装を @Alternative として宣言し (Weld が複数の実装について文句を言うのを避けるため)、ProcessBean イベントをリッスンして、SocialNetworkService の実装が見られるときに収集することができる場合があります。

于 2010-10-24T18:18:16.423 に答える