Введите класс точки входа в GWT с GIN

Я пытался сделать что-то вроде этого:

@Singleton
public class AAA implements EntryPoint, HistoryListener
{

private BBB bbb;
private CCC ccc;
private DDD ddd;
private EEE eee;

@Inject
public AAA(BBB bbb, CCC ccc, DDD ddd, EEE eee)
{
  this.bbb = bbb;
  this.ccc = ccc;
  this.ddd = ddd;
  this.eee = ee;
}
.........
}

Результат равен нулю для всех случаев.. Я ожидал, что этот способ работать...

Я знаю, что мог бы сделать что-то подобное, например,

private final MyGinjector injector = GWT.create(MyGinjector.class);

injector.getAAA()
and so on..

Почему первый способ, который я попробовал, не работает для меня? Какие-либо предложения?

Спасибо

2 ответа

Решение

Вы можете использовать injectMembers особенность Guice, которая в GIN выполняется путем объявления метода в вашем Ginjector, который принимает один аргумент.

@GinModules(...)
interface MyGinjector extends Ginjector {

   public void injectEntryPoint(AAA entryPoint);

   ...
}

public class AAA implements EntryPoint {
   @Inject private BBB bbb; // field injection works
   private CCC ccc;

   @Inject void setCcc(CCC ccc) { this.ccc = ccc; } // and of course method injection

   public onModuleLoad() {
      MyGinjector injector = GWT.create(MyGinjector.class);
      injector.injectEntryPoint(this);
      ...
   }
}

Кстати, вам не нужно комментировать вашу EntryPoint с @Singleton: если вы не внедрили его в другой класс (и вам не пришлось бы прибегать к взлому, чтобы связать его с экземпляром, созданным GWT, и чтобы GIN не создавал свой собственный), в вашем приложении будет только один экземпляр EntryPoint.

GIN зависит от GWT, поэтому GIN знает о GWT, но GWT не знает о GIN.

Итак, инициализация ваших классов через GWT.create(AAA.class) будет инициализировать AAA обычным способом GWT без GIN, что означает отсутствие внедрения зависимостей.

Для внедрения зависимости вам нужно инициализировать ваши классы через GIN, используя инжектор (как вы отметили выше).

Другие вопросы по тегам