如何给 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); }
让我们假设 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); }