Как использовать инъекцию через GIN с UiBinder и виджетами?

Я использую GWT 2.4 с платформой gwt -0.7 и gin 1.5.0.

Я создал библиотеку для динамического (живого )перевода моего приложения GWT. Таким образом, каждый виджет получит уведомление, когда LocaleChangeEventсработает, а затем попросит мой TranslationDictionaryотобразить новую строку.

Виджеты на самом деле выглядят так:

public class LocaleAwareLabel extends Label implements LocaleChangeEventHandler {
    TranslationDictionary dictionary;
    String translationToken;

    public LocaleAwareLabel(TranslationDictionary dictionary, EventBus eventBus, String translationToken) {
        this.dictionary = dictionary;
        this.translationToken = translationToken;
        eventBus.addHandler(LocaleChangeEvent.TYPE, this);
        getCurrentTranslationFromDictionary();
    }

    public void getCurrentTranslationFromDictionary() {
        this.setText(dictionary.getTranslation(translationToken));
    }

    @Override
    public void onLocaleChange(LocaleChangeEvent event) {
        getCurrentTranslationFromDictionary();
    }
}

Как видите, :я не могу легко использовать этот виджет с UiBinder, в данный момент я вставляю EventBusи TranslationDictionaryв свой Viewи использую @UiField(provided=true)вот так:

@UiField(provided=true)
LocaleAwareLabel myLabel;

@Inject
public MyView(TranslationDictionary dictionary, EventBus eventBus) {
    widget = uiBinder.createAndBindUi(this);

    myLabel = new LocaleAwareLabel(dictionary, eventBus, "someTranslationToken");
}

Что бы я хотел:Используя мои виджеты без @UiField(provided=true),так что я могу просто поместить их в ui.xmlвот так:

<custom:LocaleAwareLabel ui:field="myLabel" translationToken="someTranslationToken" />

Я знаю, что могу установить translationTokenчерез UiBinder, используя:

public void setTranslationToken(String translationToken) {
    this.translationToken = translationToken;
}

Но тогда у меня все еще есть проблема, что я не могу использовать конструктор с нулевым -args из-за EventBusи TranslationDictionary. Кроме того, я не могу вызвать getCurrentTranslationFromDictionary()внутри конструктора, потому что значение translationToken, конечно же, устанавливается после конструктора.

Было бы неплохо, если бы кто-то мог предоставить решение, возможно, с примерами кода.

И П.С. Я полный инъекционный -нуб, но, насколько я понимаю, джин может как-то решить мою проблему. Но я не знаю как.

Благодарю вас!

8
задан Benjamin M 11 July 2012 в 13:59
поделиться