2013-08-23 2 views
1

Во-первых, это хорошая практика? я попробовал то, что, кажется, правильный путь для меня, но не увенчалась успехом:Как ввести uiBinder с помощью @Inject (вместо GWT.create())?

public class FormViewImpl extends CompositeView implements HasUiHandlers<C>, FormView { 
    public interface SettlementInstructionsSearchFormViewUiBinder extends UiBinder<Widget, SettlementInstructionsSearchFormViewImpl> {} 

    @Inject 
    static FormViewImpl uiBinder; 

    @Inject 
    static Provider<DateEditorWidget> dateEditorProvider; 

    @UiField(provided = true) 
    MyComponent<String> myComp; 

    @UiField 
    DateEditorWidget effectiveDateFrom; 

    // .. other fields 

    @Inject 
    public FormViewImpl() { 
     myComp = new MyComponent<String>("lol"); 

     if (uiBinder == null) 
      uiBinder = GWT.create(SettlementInstructionsSearchFormViewUiBinder.class); 

     initWidget(uiBinder.createAndBindUi(this)); 
    } 

    @UiFactory 
    DateEditorWidget createDateEditor() { 
     return dateEditorProvider.get(); 
    } 
} 

Какие другие вещи, чем класс без аргументов требуется? В проекте моей компании такой же код работает в другом месте. Извините, что здесь высокий уровень noob ... Если у вас были какие-то указатели, было бы хорошо.

Благодаря

ответ

4

Два вопроса:

Во-первых, два из ваших @Inject полей являются статическими - вы сделали все, чтобы сделать статические поля вводить? Статические поля не устанавливаются, когда Gin (или Guice) создает новые экземпляры, их нужно установить один раз и сделать. Поскольку они являются статическими, они никогда не будут собирать мусор - это может быть хорошо с вами, или это может быть проблемой, и вы должны изменить их на поля экземпляра. Если вы хотите сохранить их статическими, тогда вы должны вызывать requestStaticInjection в своем модуле, чтобы попросить Gin инициализировать их при создании ginjector.

Далее, если вы решите удалить статические, поле uiBinder должно по-прежнему быть нулевым в этом конструкторе, потому что поля еще не могут быть введены! Как установить поле для объекта, который еще не создан? Это то, чего вы ожидаете от Джин. Вместо этого рассмотрим передачу этого аргумента в декодированный конструктор @Inject. Вам даже не нужно сохранять его как поле, так как виджет будет использовать его только один раз.

+0

Спасибо, 'requestStaticInjection' было то, что я отсутствовал. Я мог бы поместить uiBinder в конструктор, но в моем случае представление создается вручную. – Jordan

+0

В этом случае вы можете не захотеть беспокоиться о аннотации '@ Inject' на конструкторе, поскольку, как представляется, это будет управляться gin/guice. –

1

Чтобы иметь класс, сгенерированный GIN (неважно, является ли он uiBinder или нет), для него нет необходимости иметь конструктор по умолчанию (т. Е. Тот, у которого нет параметров). Класс, который требуется вводить должен иметь конструктор с аннотацией @Inject:

@Inject 
public InjectMeClass(Object a, Object b) 

Другой класс, который вводится, пусть это UiBinder, должны иметь инъекционные поля аннотированные с @UiField (при условии = истина):

public class Injected extends Composite { 

    private static InjectedUiBinder uiBinder = GWT 
      .create(InjectedUiBinder.class); 

    interface InjectedUiBinder extends UiBinder<Widget, Injected> { 
    } 

    @UiField(provided=true) 
    InjectMeClass imc; 

    public Injected(final InjectMeClass imc) { 
     this.imc=imc; 
     initWidget(uiBinder.createAndBindUi(this)); 
    } 

Итак, вернемся к вашему делу:

@UiField(provided = true) 
    MyComponent<String> myComp; 

    @Inject 
    public FormViewImpl (MyComponent<String> myComp) { 
     this.myComp = myComp; 

и, например:

public class MyComponent<T> extends Composite { 
     private T value; 

     @Inject 
     public MyComponent(T t) { 
      this.value = t; 
      ... 
     } 
     ... 
    } 

В модуле GIN вы можете иметь поставщика:

@Provides 
    @Singleton 
    public MyComponent<String> createMyComponent() { 
     return new MyComponent<String>("lol"); 
    } 
+0

Спасибо за эту информацию. Является ли поставщик Gin таким же, как UIFactory? – Jordan

+0

Понятно, что это совершенно разные вещи. На практике, как вы правильно отметили, они делают то же самое: реализуют логику построения объекта. GIN представляет собой реализацию шаблона проектирования инъекций зависимостей. UiFactory реализует заводскую модель. По моему опыту, требуется больше времени, чтобы ознакомиться с инъекцией зависимостей, но на практике мне теперь очень важно создать объекты, которые используются в вашей системе, и сохранить код в чистоте. –

Смежные вопросы