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();
}
});
}
}
Cela me permet d'appeler paresseusement la méthode .getBar()
d'un Foo
exemple fourni par l'utilisateur stocké dans un champ de MyModule
. Cependant, maintenant le provider has its own dependencies - d'où j'ai besoin de définir une classe non-anonyme, je spécifie un constructeur @Inject
sur. Quelque chose comme:
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);
}
}
}
Parfait! Sauf Guice doesn't like this ...
Exception dans le thread "principal" com.google.inject.CreationException: Impossible de créer injecteur, voir les erreurs suivantes:
1) Injecter dans les classes internes n'est pas pris en charge. Veuillez utiliser une classe "statique" (de niveau supérieur ou imbriqué) au lieu de com.example.MyModule $ BarProvider.
Donc, je suis dans une liaison. J'ai besoin d'accéder à la fois un champ sur le module et un type injecté à partir d'une classe Provider
en même temps. Est-ce qu'il y a un moyen de faire ça?
Note: cet exemple de jouet exclut une partie de la complexité réelle - en particulier la déclaration bind()
est plus impliqué, qui est la raison pour laquelle je ne peux pas définir simplement une méthode @Provides
.
Merci Jeff! Après avoir posté, j'ai réalisé que j'avais besoin de 'getProvider()'.Il me regardait droit dans les yeux, mais pour une raison quelconque, il n'a pas cliqué :) – dimo414