2015-11-20 7 views
0

Я просто изучаю возможности каркасов DI, и я сделал для этого какой-то глупый пример. У меня есть простой сервис.CDI и несколько экземпляров

public class Service implements ServiceI { 
    private Source source; 

    private Translator translator; 

    @Inject 
    public Service(Translator translator, Source source) { 
     this.translator = translator; 
     this.source = source; 
    } 

Я хочу иметь два экземпляра этой службы тот, который инициируется с TranslatorA и SourceA и вторым, который будет впрыскиваемым с различными значениями.

Как можно иметь два экземпляра с различными компонентами, введенными внутри?

Меня интересуют способы достижения этого как в Guice, так и в Weld CDI.

До сих пор я создал несколько модулей Guice и указывал bind-to в нем, как мне нравится. Но я не совсем уверен, правильно ли это. И это полностью не удается в CDI, поскольку нет модулей.

Я считаю, что наличие нескольких экземпляров должно быть довольно распространенным случаем или я ошибаюсь?

+0

Весной вы можете использовать методы @Bean и вручную устанавливать зависимости, но если я буду использовать new в CDI, bean не будет управляться, не так ли? – Zveratko

ответ

0

Как вы это сделаете с CDI, создав производителей для переводчика и источника. Это единственный способ контролировать, какие реализации используются для инъекций во время выполнения. Детали реализации могут варьироваться в зависимости от ваших конкретных нужд, но что-то, как это должно получить Вас на правильном пути

@Produces 
public Translator produceTranslator(@Dependent TranslatorA implA, @Dependent TranslatorB implB) { 
    return checkRuntimeCondition() ? implA : implB; 
} 

И то же самое для источника. Таким образом, когда вы вводите Service, CDI вызовет метод производителя для каждого параметра и использует условие выполнения для выбора реализации. YMMV по деталям, вам может потребоваться настроить дополнительные квалификаторы, чтобы избежать двусмысленности.

+0

Что делать, если я хочу что-то вроде '@Inject ServiceI serviceWithTransaltorA' и в том же классе' @Inject ServiceI serviceWithTranslatorB'? Должен ли я это делать, создавая двух продюсеров услуг? – Zveratko

+0

Наличие нескольких производителей не проблема, если вы адекватно разрешаете двусмысленность между ними. Это можно сделать с помощью квалификаторов. – jvalli

+0

Итак, что-то вроде '@Inject @TranslatorA @SourceA ServiceI serviceWithTransaltorA' и' @Inject @TranslatorB @SourceB ServiceI serviceWithTransaltorB' – Zveratko

Смежные вопросы