J'ai cette classe:
public class House {
private final Door door;
private final Window window;
private final Roof roof;
@Inject
public House(Door door, Window window, Roof roof) {
this.door = door;
this.window = window;
this.roof = roof;
}
}
Où Door
, Window
et Roof
sont des classes concrètes. Maintenant, si je veux implémenter un module pour ce scénario, je le ferais comme ceci:
public class HouseModule extends AbstractModule {
@Override
protected void configure() {
bind(Door.class).to(Door.class);
bind(Window.class).to(Window.class);
bind(Roof.class).to(Roof.class);
}
}
Mais je me demande si c'est la bonne façon de lier des classes concrètes, ou s'il existe des moyens plus faciles. Je pense qu'il existe un moyen plus simple d'y parvenir.
MODIFIER
Je viens de l'essayer et cela ne semble pas fonctionner:
1) Binding points to itself.
at de.tarent.guice.ex._1.HouseModule.configure(HouseModule.Java:10)
MODIFIER 2
Il semble qu'aucune liaison ne soit nécessaire:
Injector injector = Guice.createInjector();
House house = injector.getInstance(House.class);
Semble également fonctionner.
Guice's Just-In-Time binding fait exactement ce que vous voulez. Étant donné que votre Door
, Window
et Roof
répondent aux exigences suivantes (citées par le Guice documentation ):
soit un constructeur public sans argument, soit un constructeur avec l'annotation @Inject
une implémentation de module vide sera suffisante:
public class HouseModule extends AbstractModule {
@Override
protected void configure() {
}
}
La liaison est nécessaire pour lier l'interface et la classe d'implémentation (pour passer à une autre implémentation dans test env par exemple). Mais comme vous avez des classes concrètes, pas besoin de relier to, liez juste les classes