Как я могу ввести параметр через конструктор в 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. Работает совершенно нормально для меня.

  1. добавить библиотеку guice-assistinject в скрипт gradle

    dependencies { compile 'com.google.inject.extensions:guice-assistedinject:4.+' }
    
  2. Интерфейс Create Factory, который с помощью метода create принимает параметры, необходимые для конструктора объекта, и возвращает интерфейс объекта.

    public interface ICustomObjectFactory {
        ICustomObject create(String queueName);
    } 
    
  3. Добавьте аннотацию @Inject к конструктору объекта и аннотацию @Assisted к каждому параметру, поступающему из фабрики.

    public class CustomObject implements ICustomObject {
        protected String name;
    
        @Inject
        public CustomObject(@Assisted String name){
           this.name = name;
        }
    }
    
  4. Добавьте привязку в модуль, который вы используете

    public class SomeModule extends AbstractModule {
    
        @Override
        protected void configure() {
             install(new FactoryModuleBuilder()
                .implement(ICustomObject.class, CustomObject.class)
                .build(ICustomObjectFactory.class));
        }
    }
    
  5. Внедрить фабрику и создать экземпляры вашего объекта

    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;
    }
}
Другие вопросы по тегам