Вставить список объектов в CDI (Weld) - PullRequest
36 голосов
/ 24 октября 2010

Допустим, у меня есть интерфейс с именем SocialNetworkService и три реализации - TwitterService, FacebookService и FriendFeedService.

Теперь я хочу, когда бы мне ни управлял bean-компонент (или любой другой веб-компонент)получает сообщение, чтобы поделиться им во всех социальных сетях.Я попытался:

@Inject private List<SocialNetworkService> socialNetworkServices;

Но это не сработало (ошибка развертывания).(Также пытался использовать квалификатор @Any - тот же результат)

Итак, есть ли способ внедрить список всех (или некоторых) реализаций интерфейса?

Я знаю правилочто данная точка инъекции не должна иметь более одного возможного компонента.Я думаю, что я могу добиться этого, создав производителя, который создает список, и используя Instance<SocialNetworkService>, но это кажется слишком большим для этой задачи.

Ответы [ 2 ]

64 голосов
/ 25 октября 2010

Объединение моих попыток с ответом с форума 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) {..}
    
0 голосов
/ 24 октября 2010

Я посмотрел на спецификацию JSR-299, и не похоже, что вы можете делать то, что хотите, легко, и у меня недостаточно опыта в Weld, чтобы предоставить код для этого особого случая.

Однако, основываясь на главе 12.3 «Обнаружение bean-компонентов», вы можете объявить реализации как @ Alternative (чтобы избежать жалоб Weld на множественные реализации) и прослушивать события ProcessBean для сбора, когда видны реализации SocialNetworkService.

...