Google Guice和运行时的不同注入

时间:2011-10-04 17:51:28

标签: dependency-injection guice

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

在阅读文档之后,似乎我可以在需要在运行时根据“版本”选择实现的情况下实现提供程序。另外,我可以在果汁上自己动手。

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

感谢您的帮助!

-Joe

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

}