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 напрямую).
Другие вопросы по тегам