Как я могу ввести параметр через конструктор в Roboguice? [Android]
Этот вопрос, вероятно, является точной копией этого одного параметра Pass для конструктора с Guice
Разница в том, что я использую roboguice для Android, а не только Guice, поэтому ответы там не работают для меня.
Вопрос - как я могу передать параметры инициализации в созданный объект? Т.е. я ввел интерфейс, который должен быть инициализирован некоторым параметром, который не знает roboguice.
Что я вижу в ссылке, которую я предоставляю, я должен создать заводской интерфейс и зарегистрировать его следующим образом
void configure(Binder binder) {
binder.install(new FactoryModuleBuilder()
.implement(FooInterface.class, Foo.class)
.build(FooFactory.class));
}
Но я не могу найти класс FactoryModuleBuilder. Я использую Intellij IDEA, он может показать мне все классы, к которым я могу получить доступ в текущем месте, и я могу быть на 100% уверен, что нет классов, которые начинаются со слова "Фабрика".
Как я могу создать свою фабрику, используя roboguice?
ОБНОВЛЕНО
Я забыл скачать guice-Assistedinject. Но все же я не могу понять, где мне зарегистрировать эту фабрику.
ОБНОВЛЕНИЕ 2
Зачем мне это нужно? Потому что должна быть ситуация, когда некоторая абстракция имеет зависимость, которая не может быть решена с помощью Roboguice. Эта зависимость может быть любого типа, даже простая строка или число.
В моем случае у меня есть элемент управления NumberPicker для пользовательского интерфейса, и я хочу переместить все специфические для пользовательского интерфейса задачи в класс MyNumberPickerWrapper. И когда я создаю эту оболочку, я внедряю ее зависимость (этот элемент управления) через конструктор.
Не в этом суть, если я прав с таким подходом, но может быть множество других более подходящих примеров, где необходимо внедрение конструктора, и эти внедренные классы не могут быть созданы Roboguice.
2 ответа
Я выполнил шаги ответа, данного в параметре Pass для конструктора с Guice, и сделал небольшие изменения, чтобы запустить его под roboguice. Работает совершенно нормально для меня.
добавить библиотеку guice-assistinject в скрипт gradle
dependencies { compile 'com.google.inject.extensions:guice-assistedinject:4.+' }
Интерфейс Create Factory, который с помощью метода create принимает параметры, необходимые для конструктора объекта, и возвращает интерфейс объекта.
public interface ICustomObjectFactory { ICustomObject create(String queueName); }
Добавьте аннотацию @Inject к конструктору объекта и аннотацию @Assisted к каждому параметру, поступающему из фабрики.
public class CustomObject implements ICustomObject { protected String name; @Inject public CustomObject(@Assisted String name){ this.name = name; } }
Добавьте привязку в модуль, который вы используете
public class SomeModule extends AbstractModule { @Override protected void configure() { install(new FactoryModuleBuilder() .implement(ICustomObject.class, CustomObject.class) .build(ICustomObjectFactory.class)); } }
Внедрить фабрику и создать экземпляры вашего объекта
public class SomeClass { @Inject ICustomObjectFactory factory; public SomeClass () { ICustomObject first = this.factory.create("first"); ICustomObject second = this.factory.create("second"); } }
Я столкнулся с той же проблемой, и мне это удалось благодаря ответу Павла. Мне пришлось бороться только с некоторыми ошибками, и я не знаю, связано ли это с версиями используемых библиотек, но для меня не получилось без изменения аннотации конструктора, замены @Inject
от @AssistedInject
, При этом код класса, который реализует интерфейс, выглядит следующим образом.
public class CustomObject implements ICustomObject {
protected String name;
@AssistedInject
public CustomObject(@Assisted String name){
this.name = name;
}
}