2011-10-04 4 views
0

Я хотел бы изменить внедренные реализации на основе того, что неизвестно до выполнения. В частности, я хотел бы, чтобы мое приложение работало как разные версии, где «версия» не определяется до тех пор, пока запрос не будет выполнен. Кроме того, «версия» может варьироваться в зависимости от запроса.Google Guice и различные инъекции во время выполнения

После прочтения документов кажется, что я могу реализовать поставщиков в случаях, когда мне нужно выбрать реализацию во время выполнения на основе «версии». Кроме того, я мог бы свернуть сам по себе сверху сока.

Осуществляет ли поставщик лучший способ пойти в этом сценарии? Я хотел бы знать, есть ли лучшая практика или кто-то еще пытался использовать Guice для решения этой проблемы.

Спасибо за помощь!

-Joe

+1

Как вы планируете осуществить «версию» -ИНФОРМАЦИЯ? Параметры метода? Аннотации? –

ответ

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

} 
Смежные вопросы