我想基于直到运行时才知道的内容来改变注入的实现。具体来说,我希望我的应用程序可以作为不同版本运行,其中“版本”在请求执行之前未确定。此外,“版本”可能因请求而异。
在阅读文档之后,似乎我可以在需要在运行时根据“版本”选择实现的情况下实现提供程序。另外,我可以在果汁上自己动手。
在这种情况下,实施提供商是最好的方法吗?我想知道是否有最佳做法,或者是否有其他人试图使用Guice来解决这个问题。
感谢您的帮助!
-Joe
答案 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));
}