#dependency-injection #guice
#внедрение зависимостей #графический интерфейс
Вопрос:
Я хотел бы изменить внедренные реализации на основе чего-то, что неизвестно до времени выполнения. В частности, я бы хотел, чтобы мое приложение работало как разные версии, где «версия» не определяется до тех пор, пока не будет выполнен запрос. Кроме того, «версия» может варьироваться в зависимости от запроса.
После прочтения документов кажется, что я мог бы реализовать провайдеров в тех случаях, когда мне нужно выбрать реализацию во время выполнения на основе «версии». Кроме того, я мог бы использовать свой собственный поверх juice.
Является ли внедрение поставщика лучшим способом в этом сценарии? Я хотел бы знать, есть ли лучшая практика или кто-нибудь еще пытался использовать Guice для решения этой проблемы.
Спасибо за любую помощь!
-Джо
Комментарии:
1. Как вы планируете реализовать информацию о «версии»? Параметры метода? Аннотации?
Ответ №1:
Я думаю, что если версия может быть известна только во время выполнения, вы должны предоставить версионные «сервисы» вручную пользовательскому поставщику. Возможно, что-то вроде этого:
@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);
}
Ответ №2:
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));
}