如何给 Google 的 Guice Provider 提供参数?

How to provide parameter to Google's Guice Provider?

让我们假设 UI 应该根据用户的选择传递 2 或 4。 后端使用来自 Guice 的 Provider 来实例化有效的 class。 然而,'get' 本身不接受任何参数,但是我想做一些类似于下面的相同代码的事情。如何实现?

public class VehicleProvider implements Provider<Vehicle> {

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

在构造函数中注入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
         */
    }
}

要完成与 "passing a parameter to a provider" 最相似的事情,您可以定义一个工厂 class,例如:

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

然后将这个工厂注入到需要创建Vehicle实例的地方。

您可以考虑使用 Assisted injection 来定义工厂的绑定;每次使用辅助注射都会让我很困惑,所以你可能想先考虑更简单的解决方案。

如果您实际上只需要制造 2 轮或 4 轮车辆(而不是其他任意数量的车辆),您可以为您的工厂提供特定方法:

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