Dependency injection GoogleGuice和运行时的各种注入

Dependency injection GoogleGuice和运行时的各种注入,dependency-injection,guice,Dependency Injection,Guice,我想根据一些直到运行时才知道的东西来改变注入的实现。具体来说,我希望我的应用程序作为不同的版本运行,其中“版本”在执行请求之前不确定。此外,“版本”可能因请求而异 在阅读文档之后,我似乎可以在需要根据“版本”在运行时选择实现的情况下实现一个提供者。此外,我还可以在果汁上自己滚 在这种情况下,实现提供者是最好的方法吗?我想知道是否有最佳实践,或者是否有其他人尝试使用Guice来解决这个问题 谢谢你的帮助 -Joe我认为,如果只能在运行时知道版本,则必须使用自定义提供程序手动提供版本化的“服务”。可

我想根据一些直到运行时才知道的东西来改变注入的实现。具体来说,我希望我的应用程序作为不同的版本运行,其中“版本”在执行请求之前不确定。此外,“版本”可能因请求而异

在阅读文档之后,我似乎可以在需要根据“版本”在运行时选择实现的情况下实现一个提供者。此外,我还可以在果汁上自己滚

在这种情况下,实现提供者是最好的方法吗?我想知道是否有最佳实践,或者是否有其他人尝试使用Guice来解决这个问题

谢谢你的帮助


-Joe

我认为,如果只能在运行时知道版本,则必须使用自定义提供程序手动提供版本化的“服务”。可能是这样的:

@Singleton
public abstract class VersionedProvider<T, V> {

    private Map<V, T> objects;

    T get(V version) {
        if (!objects.containsKey(version)) {
            objects.put(version, generateVersioned(version));
        }
        return objects.get(version);
    }

    // Here everything must be done manually or use some injected
    // implementations
    public abstract T generateVersioned(V version);
}
@Singleton
公共抽象类VersionedProvider{
私有地图对象;
T get(V版){
如果(!objects.containsKey(版本)){
objects.put(版本,generateVersioned(版本));
}
返回objects.get(版本);
}
//在这里,一切都必须手动完成,或者使用一些注入的
//实现
公开摘要T生成(V版);
}
公共类MyRuntimeServiceModule扩展了AbstractModule{
私有最终字符串运行时选项;
公共服务模块(字符串运行时选项){
this.runTimeOption=runTimeOption;
}
@覆盖受保护的void configure(){

CLASS您计划如何实现“版本”-信息?方法参数?注释?
public class MyRuntimeServiceModule extends AbstractModule {
  private final String runTimeOption;

  public ServiceModule(String runTimeOption) {
    this.runTimeOption = runTimeOption;
  }

  @Override protected void configure() {

    Class<? extends Service> serviceType = option.equals("aServiceType") ?
        AServiceImplementation.class : AnotherServiceImplementation.class;
    bind(Service.class).to(serviceType);
  }
}

  public static void main(String[] args) {
  String option = args[0];
  Injector injector = Guice.createInjector(new MyRuntimeServiceModule(option));

}