Как предоставить параметр провайдеру Google Guice? - PullRequest
0 голосов
/ 23 апреля 2020

Предположим, что пользовательский интерфейс должен пройти либо 2, либо 4, в зависимости от того, какой выбор делает пользователь. Бэкэнд использует Provider из Guice для создания экземпляра допустимого класса. Однако сам по себе ' get ' не принимает никаких параметров, однако я хочу сделать что-то вроде того же кода ниже. Как это можно сделать?

public class VehicleProvider implements Provider<Vehicle> {

    public Vehicles get(int numberOfTyres) {
        /**
         * numberTyres == 2
         *    return new TwoWheelVehicles
         * numberTyres == 4
         *    return new FourWheelVehicles
         */
    }
}

Ответы [ 2 ]

3 голосов
/ 23 апреля 2020

Чтобы сделать вещь, наиболее похожую на «передачу параметра поставщику», вы можете определить класс фабрики, например:

class VehicleFactory {
  Vehicle build(int numWheels) {
    return new Vehicle(numWheels);
  }
}

, а затем внедрить эту фабрику в место, которое необходимо создать. случаи Vehicle.

Вы можете рассмотреть возможность использования Вспомогательная инъекция для определения привязок для фабрики; вспомогательная инъекция сильно смущает меня, когда я ее использую, поэтому вы можете сначала рассмотреть более простые решения.

Если вам действительно нужно создавать только 2- или 4-колесные транспортные средства (а не какое-то другое произвольное число), Вы можете указать фабричные методы c:

class VehicleFactory {
  Vehicle buildTwoWheeled() {
    return new Vehicle(2);
  }

  Vehicle buildFourWheeled() {
    return new Vehicle(4);
  }
}

Или вы можете привязать отдельные экземпляры провайдера:

public class TwoWheelVehicleProvider implements Provider<Vehicle> { ... }
public class FourWheelVehicleProvider implements Provider<Vehicle> { ... }

Или определить аннотации привязки:

@Provides @TwoWheeled
Vehicle provideTwoWheeledVehicle() { return new Vehicle(2); }

@Provides @FourWheeled
Vehicle provideFourWheeledVehicle() { return new Vehicle(4); }
1 голос
/ 23 апреля 2020

Ввести numberOfTires в конструкторе:

public class VehicleProvider implements Provider<Vehicle> {
    private final int numberOfTyres;

    @Inject
    VehicleProvider(int numberOfTyres) {
      this.numberOfTyres = numberOfTyres;
    }

    @Override
    public Vehicles get() {
        /**
         * numberTyres == 2
         *    return new TwoWheelVehicles
         * numberTyres == 4
         *    return new FourWheelVehicles
         */
    }
}
...