Инъекция зависимости не работает в gwt 2.1 - PullRequest
3 голосов
/ 04 марта 2011

У меня есть новый проект, в котором я использую GWT-виды, такие как Composite и т. Д.

Я ввел элементы в главное меню (например, ProductList ниже), используя GinInjector.Это прекрасно работает!

Где-то я хочу получить ссылку из небольшого компонента на элемент из моего главного меню, чтобы обновить его.Я пытаюсь ввести это так:

public class ProductForm extends Composite {
   ...
   @Inject 
   ProductList list;
   ....

}

Но когда я использую list, я всегда получаю null.При этом ProductList определяется следующим образом:

public class MyModule extends AbstractGinModule {
   ...
   @Override
   protected void configure() {
      bind(ProductList.class).asEagerSingleton();
      bind(ProductForm.class).asEagerSingleton();
   }
   ...
}

Есть идеи, что я делаю неправильно?!

Решение : я не упомянул, что ProductForm являетсяэлемент ProductList, использующий тег @UIField UIBinder, поэтому для его внедрения будет создан новый объект, а не объект, созданный с помощью UIBinder.необходимы прямые ссылки между представлениями (кроме атрибутов @UIField).

Ответы [ 3 ]

4 голосов
/ 21 марта 2011

Я работал с документацией Джина: я процитирую это здесь:

Джин "Волшебство" Джин пытается сделать инъекцию безболезненной и удалить как можно больше шаблонного кода из вашего кода.Для этого в сгенерированном коде есть некое волшебство за кулисами, которое объясняется здесь.

Отложенное связывание Один из способов, которым Джин оптимизирует код, заключается в автоматизации отложенного связывания GWT.Поэтому, если вы внедряете интерфейс или class1, привязанные через отложенное связывание (но не через привязку Guice / Gin), Gin внутренне вызовет GWT.create для него и внедрит результат.Одним из примеров являются сообщения и константы GWT (используемые для целей i18n):

public interface MyConstants extends Constants {
  String myWords();
}

public class MyWidget {

  @Inject
  public MyWidget(MyConstants myconstants) {
    // The injected constants object will be fully initialized - 
    // GWT.create has been called on it and no further work is necessary.
  }
}

Примечание. Gin не будет связывать экземпляры, созданные с помощью GWT.create, в одноэлементной области.Это не должно приводить к ненужным накладным расходам, поскольку генераторы отложенного связывания обычно реализуют одноэлементные шаблоны в своем сгенерированном коде.

Вы можете убедиться сами в этом URL: http://code.google.com/p/google-gin/wiki/GinTutorial

Не упоминается, почему синглтон не может быть автоматически сгенерирован с помощью отложенной привязки и введен.

Это можно исправить с помощью ручного создания, используя GWT.create(YourFactoryInterface.class).getProductList() в конструкторе.

Это означает для проверки целей,вам нужно будет перетащить GWT.create в отдельный метод, переопределить его в подклассе и использовать его для тестирования, например:

YourFactoryInterface getFactory() {
  return GWT.create(YourFactoryInterface.class)
}

и

getFactory().getProductList()
1 голос
/ 21 марта 2011

Привязка Джина asEagerSingleton() довольно долго нарушалась, и он вводил ноль. Не уверен, когда исправление вошло, но у меня были проблемы с нетерпеливыми одиночками на v1.0. См. вопрос или объяснение , если вам интересно. Я бы либо переключился на обычные привязки .in(Singleton.class), либо убедился бы, что вы используете Gin 1.5.

0 голосов
/ 04 марта 2011

Ginjector создает ProductForm? Я думаю, может быть, это необходимо, чтобы заполнить введенную переменную.

...