Используйте gwt ui-binding совместно с google-gin - PullRequest
2 голосов
/ 04 января 2012

Есть ли способ использовать внедрение зависимостей в виджет, который создается через привязку пользовательского интерфейса?

Предположим, у меня есть простой виджет (в пакете com.example.client.ui.widget):

public class Foo extends Composite {

    private final EventBus eventBus;

    @Inject
    public Foo(final EventBus eventBus) {
        this.eventBus = eventBus;
        // create ui
    }
}

и затем у меня есть представление, которое определяется через привязку пользовательского интерфейса, который использует этот виджет. например:

<ui:UiBinder xmlns:ui='urn:ui:com.google.gwt.uibinder'
    xmlns:g='urn:import:com.google.gwt.user.client.ui'
    xmlns:app='urn:import:com.example.client.ui.widget'>

    <g:HorizontalPanel>
        <app:Foo/>
    </g:HorizontalPanel>
</ui:UiBinder>

Выполнение этого не работает из-за ограничения конструктора без аргументов для виджетов, которые используются в привязке пользовательского интерфейса. Но не было бы неплохо, если бы компилятор GWT просто использовал GIN, если есть аннотация @Inject? Или это можно сделать любым другим способом? Может быть, я полностью упускаю концепцию GIN и GWT, если да, то любые советы очень ценятся.

Спасибо заранее, Markus

1 Ответ

3 голосов
/ 04 января 2012

если вам нужна инъекция зависимостей для виджетов, вы делаете что-то не так.

НО

Можно использовать GIN для добавления некоторых вещей в ваши виджеты.

Подумайте о следующем: GIN - это автономная структура внедрения зависимостей, вы просто спросите, что вам нужно, GIN создаст компонент с разрешенными зависимостями.Инъекция будет выполняться только в том случае, если объект был получен из экземпляра Ginjector.Связующий пользовательский интерфейс - это структура для декларативного пользовательского интерфейса, он создает виджеты на основе вашего XML (и выполняет множество других вещей, но мы можем пока игнорировать это).

Так что, если мы хотим использовать GIN для внедрения зависимостейв виджет, это означает, что виджет должен быть создан GIN, а не UiBinder.UiBinder должен будет использовать инстаграм, предоставленный GIN.Является ли это возможным?Да, UiBinder позволяет:

с использованием аннотации @UiField (предоставляется = true) в поле виджета

или

с использованием @ UiFactory

Итак, вам нужно создать привязку для виджета в вашем GinModule, получить его экземпляр через Ginjector или провайдера инъекций для виджета, чем вы можете передать экземпляр виджета в UiBinder через @UiField (условии = true) или @UiFactory.

...