Я пытаюсь собрать многопроектное приложение, в котором один из подпроектов имеет несколько представлений для одного докладчика. Я использую Gin для внедрения представлений в своих докладчиков.
Подпроект содержит докладчика и 2 разных представления. У меня есть 2 отдельных модуля gin, каждый из которых привязывает одно из представлений к интерфейсу представления.
Согласно предложению Томаса Бройера по ответу на это сообщение, мои Ginjectors завернуты в класс «держателя», который вызывает GWT.create для конкретного ginjector. Соответствующий держатель настраивается в файле gwt.xml с помощью оператора replace-with.
Когда я запускаю свой проект в режиме разработки, я вижу, что альтернативное представление появляется так, как я и ожидал. Однако, когда я компилирую проект, я все равно получаю представление по умолчанию. Кроме того, только 6 перестановок (я ожидал бы большего из-за логики замены), и я не получаю представление, которое ожидаю в разных сценариях.
Вот код для иллюстрации.
Subproject.gwt.xml содержит следующее:
<replace-with class="com.example.GinjectorDesktopHolder">
<when-type-is class="com.example.GinjectorHolder" />
</replace-with>
<replace-with class="com.example.GinjectorTabletHolder">
<when-type-is class="com.example.GinjectorHolder" />
<when-property-is name="formfactor" value="tablet" />
</replace-with>
Переменная "formfactor" определена в файле gwt.xml, дословно скопированном из пример проекта мобильного веб-приложения.
Классы держателя выглядят следующим образом:
public abstract class GinjectorHolder {
public abstract Ginjector getGinjector();
}
public class GinjectorTabletHolder extends GinjectorHolder {
@Override
public Ginjector getGinjector() {
return GWT.create(GinjectorTablet.class);
}
}
public class GinjectorDesktopHolder extends GinjectorHolder {
@Override
public Ginjector getGinjector() {
return GWT.create(GinjectorDesktop.class);
}
}
Мои джинжекторы выглядят так:
public interface MyGinjector {
MyView getView();
EventBus getEventBus();
}
@GinModules({ModuleDesktop.class})
public interface GinjectorDesktop extends Ginjector, MyGinjector {}
@GinModules({ModuleTablet.class})
public interface GinjectorTablet extends Ginjector, MyGinjector {}
Мои модули выглядят так:
public class ModuleDesktop extends AbstractGinModule {
@Override
protected void configure() {
bind(MyPresenter.View.class).to(DesktopView.class);
}
}
public class ModuleTablet extends AbstractGinModule {
@Override
protected void configure() {
bind(MyPresenter.View.class).to(TabletView.class);
}
}
И, наконец, в моем прокси-сервере презентатора, в основном точке входа в этот конкретный подпроект, у меня есть эта строка:
GinjectorHolder holder = GWT.create(GinjectorHolder.class);
MyGinjector ginjector = holder.getGinjector();
Как упоминалось ранее, когда я запускаю режим разработки и устанавливаю точки останова, я вижу, что создается соответствующий GinjectorHolder. FormFactor.gwt.xml (ссылка выше) предоставляет переключатель для использования параметра URL для переключения на контекст, который вы хотели бы видеть. Таким образом, я могу сделать formfactor=tablet в URL-адресе, и будет создан держатель Tablet Ginjector.
<collapse-property name="formfactor" values="*"/>
(из примера мобильного веб-приложения), компилируются ли тогда дополнительные перестановки? - person Chris Lercher   schedule 09.08.2013