Подтвердить что ты не робот

Guice Beginner - Как связать конкретные классы?

У меня есть этот класс:

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 и Roof - это конкретные классы. Теперь, если я хочу реализовать модуль для этого сценария, я бы сделал это следующим образом:

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

Но мне интересно, правильно ли это связать конкретные классы или есть более простые способы. Я чувствую, что есть более простой способ этого.

ИЗМЕНИТЬ

Просто попробовал это, и он не работает:

1) Binding points to itself.
  at de.tarent.guice.ex._1.HouseModule.configure(HouseModule.java:10)

РЕДАКТИРОВАТЬ 2

Кажется, что никакой привязки не требуется вообще:

Injector injector = Guice.createInjector();
House house = injector.getInstance(House.class);

Также, похоже, работает.

4b9b3361

Ответ 1

Guice Взаимодействие Just-In-Time делает именно то, что вы хотите. Учитывая ваши Door, Window и Roof отвечают следующим требованиям (цитируется в документации Guice ):

либо публичный конструктор без аргументов, либо конструктор с аннотацией @Inject

будет достаточной пустая реализация модуля:

public class HouseModule extends AbstractModule {
    @Override
    protected void configure() {
    }
}

Ответ 2

Это путь:

protected void configure() {
    bind(Door.class);
    bind(Window.class);
    bind(Roof.class);
}

Поскольку они являются конкретными классами, как говорит Гиис, вы не можете привязывать их к себе: -)

Просмотрите Binder docs, он отмечает:

bind(ServiceImpl.class);

Этот оператор практически ничего не делает; он "привязывает класс ServiceImpl к себе" и не изменяет поведение по умолчанию Guice. Вы все равно можете использовать это, если предпочитаете, чтобы ваш класс Module служил явным манифестом для предоставляемых услуг. Кроме того, в редких случаях Guice может оказаться неспособным проверить привязку во время создания инжектора, если это не указано явно.

Конкретные классы с конструктором, помеченные как @Inject, автоматически доступны для инъекций. Но это помогает разработчику (вам) знать, что настроено в модуле.

Ответ 3

Связывание необходимо для связывания интерфейса и класса реализации (для перехода к другой реализации в тестовой среде, например). Но поскольку у вас есть конкретные классы, нет необходимости связывать с, просто привяжите классы