Как использовать Google Guice для создания объектов, требующих параметров?
Возможно, я просто слеп, но я не вижу, как использовать Guice (только начиная с него), чтобы заменить вызов new
в этом методе:
public boolean myMethod(String anInputValue) {
Processor proc = new ProcessorImpl(anInputValue);
return proc.isEnabled();
}
Для тестирования может быть другая реализация Процессора, поэтому я бы хотел избежать вызова new
и в процессе этого избавиться от зависимости от реализации.
Если бы мой класс мог просто вспомнить экземпляр Процессора, я мог бы добавить его через конструктор, но поскольку Процессоры предназначены для неизменяемости, каждый раз мне нужен новый.
Как мне это сделать и достичь с помощью Guice (2.0)?
Ответы
Ответ 1
Есть некоторое время с тех пор, как я использовал Guice сейчас, но я помню что-то под названием "вспомогательная инъекция". Он позволяет определить метод factory, где некоторые параметры предоставляются, а некоторые - впрыскиваются. Вместо ввода процессора вы вводите процессор factory, который имеет метод factory, который принимает параметр anInputValue
.
Я указываю вам на javadoc FactoryProvider. Я считаю, что это должно быть полезно для вас.
Ответ 2
Вы можете получить желаемый эффект, введя "Поставщик", который может попросить во время выполнения предоставить вам процессор. Поставщики предоставляют возможность отложить строительство объекта до тех пор, пока не запросят.
Они описаны в Guice Docs здесь и здесь.
Поставщик будет выглядеть примерно так:
public class ProcessorProvider implements Provider<Processor> {
public Processor get() {
// construct and return a Processor
}
}
Так как Providers сконструированы и введены Guice, они могут сами вставлять бит.
Ваш код будет выглядеть примерно так:
@Inject
public MyClass(ProcessorProvider processorProvider) {
this.processorProvider = processorProvider;
}
public boolean myMethod(String anInputValue) {
return processorProvider.get().isEnabled(anInputValue);
}
Ответ 3
Требуется ли вашему процессору доступ к anInputValue
для всего жизненного цикла? Если нет, можно ли передать значение для вызова метода, который вы используете, например:
@Inject
public MyClass(Processor processor) {
this.processor = processor;
}
public boolean myMethod(String anInputValue) {
return processor.isEnabled(anInputValue);
}