web-dev-qa-db-fra.com

Guice Beginner - Comment lier des classes concrètes?

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;
    }
}

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.

40
helpermethod

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() {
    }
}
29
edwardw

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

6
korifey