GIN - передать параметр конструктора в мой ClientModule
У меня довольно простое использование GIN в моем проекте GWT. Я следовал руководству Guice, чтобы настроить его.
Я хочу связать неизменную переменную Long с аннотацией в моем подклассе AbstractGinModule. Проблема в том, что теперь я знаю значение переменной до времени выполнения (onModuleLoad). У меня есть значение, прежде чем я создаю Ginjector... Я просто не знаю, как вставить его в мой клиентский модуль.
Я видел ответы, в которых говорится, что я могу передать параметр конструктора в мой ClientModule... но я не вижу, где он создается. Это просто аннотация проводки.
@GinModules(MyClientModule.class)
public interface MyGinjector extends Ginjector {
}
public class MyClientModule extends AbstractGinModule {
@Override
protected void configure() {
bindConstant().annotatedWith(named("MyConstant")).to(???);
}
public class MyEntryPoint implements EntryPoint {
@Override
public void onModuleLoad() {
long myValue = 123456L;
MyGinjector injector = GWT.create(MyGinjector.class);
}
Итак, как я могу получить свое значение 123456L в методе configure() MyClientModule?
3 ответа
Единственный способ передать значения в GIN - это использовать общее состояние, т.е. static
переменная / метод, который вы можете установить на одной стороне и доступ / вызов из вашего GinModule
,
Если вы не знаете значение вашей переменной во время компиляции, это технически не является константой. Кроме того, если память служит, класс модуля используется во время компиляции, а не во время выполнения, поэтому этот подход не совсем сработает.
Не могли бы вы просто инициализировать вашу переменную, когда у вас есть значение?
Другой подход, которым вы можете следовать:
@Singleton
public class MyConstants {
private long myLong = null;
public void setLong(long yourLong) {
this.myLong = yourLong;
}
public long getLong() {
return myLong;
}
}
И тогда в вашем EntryPoint получите класс:
public class MyEntryPoint implements EntryPoint {
@Override
public void onModuleLoad() {
MyGinjector.INSTANCE.getApplication().execute();
}
}
-
public interface AppInjectorGin extends Ginjector {
@GinModules(MyClientModule.class)
public interface MyGinjector extends AppInjectorGin{
MyGinjector INSTANCE = GWT.create(MyGinjector.class);
AppMain getApplication();
}
//Space for more Injectors if you need them :)
}
-
public class AppMain {
@Inject MyConstants myConstants;
public void execute() {
long theLong = 12345L;
myConstants.setLong(theLong);
//And now in every single place of your app, if you do
//@Inject MyConstants you will have there the value of the long.
}
}
Здесь есть два ключа:
- Аннотация
@Singleton
на урокеMyConstants
(иначеGIN
создаст новый экземпляр всегда). - Класс
AppMain
нужно делать таким образом, иначе инъекция@Inject MyConstants
будет нулевым (если вы попытаетесь получить к нему доступ вEntryPoint
напрямую).