首页 > 解决方案 > 如何向 Google 的 Guice Provider 提供参数?

问题描述

让我们假设 UI 应该通过 2 或 4,具体取决于用户做出的选择。后端使用 Guice 的 Provider 来实例化有效的类。但是' get '本身不接受任何参数,但是我想做一些类似下面的相同代码的事情。如何做到这一点?

public class VehicleProvider implements Provider<Vehicle> {

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

标签: javaguice

解决方案


要做最类似于“将参数传递给提供者”的事情,您可以定义一个工厂类,例如:

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

然后将该工厂注入到需要创建Vehicle.

您可以考虑使用辅助注入来定义工厂的绑定;每当我使用辅助注射时,它都会让我很困惑,因此您可能需要先考虑更简单的解决方案。

如果您实际上只需要创建 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); }

推荐阅读