игрушки:Как переместить анонимного провайдера, который ссылается на поля в модуле в отдельный класс?
public class MyModule extends AbstractModule {
private static final Foo foo;
public MyModule(Foo foo) {
this.foo = foo;
}
@Override
public void configure() {
bind(Bar.class).toProvider(new Provider<Bar>() {
@Override public Bar get() {
return foo.getBar();
}
});
}
}
Это позволяет мне лениво вызвать .getBar()
метод предоставленного пользователем Foo
экземпляра, хранящегося в области MyModule
. Однако теперь provider has its own dependencies - следовательно, мне нужно определить не-анонимный класс. Я указываю конструктор @Inject
. Что-то вроде:
public class MyModule extends AbstractModule {
private static final Foo foo;
public MyModule(Foo foo) {
this.foo = foo;
}
@Override
public void configure() {
bind(Bar.class).toProvider(BarProvider.class);
}
BarProvider implements Provider<Bar> {
private Baz baz;
@Inject BarProvider(Baz baz) {
this.baz = baz;
}
@Override public Bar get() {
return foo.getBar(baz);
}
}
}
Отлично! Кроме Guice doesn't like this ...
Исключение в потоке «основного» com.google.inject.CreationException: Невозможно создать инжектор, см следующие ошибки:
1) Впрыскивание во внутренние классы не поддерживается. Используйте вместо класса com.example класс 'static' (верхний уровень или вложенный) .MyModule $ BarProvider.
Итак, я на связи. Мне нужно одновременно получить как поле на модуле, так и введенный тип из класса Provider
. Есть какой-либо способ сделать это?
Примечание: эта игрушка пример исключает некоторые из реальной сложности - в частности, bind()
утверждение более активное участие, поэтому я не могу просто определить @Provides
метод.
Thanks Jeff! После публикации я понял, что мне нужен был 'getProvider()'.Он смотрел мне прямо в лицо, но почему-то он не нажал :) – dimo414