2016-03-12 4 views
1

Я довольно новичок в Guice и пытаюсь выяснить, разрешена ли моя проблема с Guice. У меня есть основной класс Driver, который выглядит следующим образом:Guice: условно создать 1 конкретную реализацию интерфейса (среди многих) во время выполнения

public class Driver{ 
    execute(){ 
    Manager m = injector.getInstance(Manager.class); 
    } 
} 

public class Manager{ 

    private List<IExecutor> executors; 

    @Inject 
    public Manager(IExecutorWrapper executor){ 
    this.executors = executor.getExecutors(); 
    } 

    public List<IExecutor> getExecutors() { 
    return executors; 
    } 

} 

Мой IExecutorWrapper класс имеет несколько реализаций, каждый дает свой собственный список IExecutors. Во время выполнения выбирается только 1, логика выбора, какая реализация зависит от контекста. Каков наилучший способ для этого, чтобы мой класс драйвера не нуждался в изменении? Как будет выглядеть мой GuiceModule?

Спасибо!

+0

Что является логикой выбора для «IExecutorWrapper»? –

+0

Если ctx.contains ("a"), выберите 1 другой вариант другого. – sharath

+0

Вы должны быть более конкретными. каков ваш контекст? От куда это? которые создают/обновляют его? –

ответ

0

Для достижения этого вы можете использовать настраиваемый поставщик, если для каждого запроса создается Менеджер.

Если Context является инъекционным (и, возможно, запрос области действия услуги):

@Provides 
IExecutorWrapper createIExecutorWrapper(Context context) { 
    if (context.isXX()) { 
    return new Executor1(); 
    } else { 
    return new Executor2(); 
    } 
} 

Если реализации IExecutorWrapper следует вводить с помощью Guice, вы можете аннотированные каждый тип реализации, и впрыснуть поставщик:

@Provides 
IExecutorWrapper createIExecutorWrapper(Context context, 
     @Type1 Provider<IExecturoWrapper> type1, 
     @Type2 Provider<IExecutorWrapper> type2) { 
    if (context.isXXX()) { 
    return type1.get(); 
    } else { 
    return type2.get(); 
    } 
} 

и конфигурация:

bind(IExecutorWrapper.class).annotatedWith(Type1.class).to(Executor1.class); 
bind(IExecutorWrapper.class).annotatedWith(Type2.class).to(Executor2.class);