Использование Gin для внедрения нескольких представлений
Я пытаюсь собрать многопроектное приложение, в котором один из подпроектов имеет несколько представлений для одного докладчика. Я использую Джин, чтобы внедрить представления в моих докладчиков.
Подпроект содержит докладчика и два разных представления. У меня есть 2 отдельных модуля джина, каждый из которых привязывает одно из представлений к интерфейсу представления.
Согласно предложению Томаса Бройера в ответе на этот пост, мои Ginjectors обернуты в класс "holder", который вызывает GWT.create для конкретного ginjector. Соответствующий держатель настраивается в файле gwt.xml с помощью оператора замены.
Когда я запускаю свой проект в режиме разработки, я вижу альтернативное представление, которое я ожидаю. Однако, когда я компилирую проект, я все равно получаю только представление по умолчанию. Кроме того, только 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 из примера проекта GWT mobilewebapp.
Классы Holder выглядят так:
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);
}
}
Мои Ginjectors выглядят так:
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, и держатель Ginjector планшета создан.
2 ответа
Как уже упоминалось в комментариях, удаление строки
<collapse-property name="formfactor" values="*"/>
приводит к ожидаемому увеличению количества перестановок.
Тем не менее, это загадочно, почему это необходимо, потому что обычно должно быть возможно свернуть любые свойства, которые вам нравятся - это просто означает, что каждый браузер должен загружать больше кода, но все равно должен получать все, что ему нужно. Может быть ошибка.
Прежде всего, вместо сопоставления view с viewimpl, вы можете привязать его к viewprovider, а затем, основываясь на значениях user-agent, вы можете вернуть соответствующий экземпляр для привязки.