Использование Gin для внедрения нескольких представлений

Я пытаюсь собрать многопроектное приложение, в котором один из подпроектов имеет несколько представлений для одного докладчика. Я использую 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.


person Lavie Tobey    schedule 09.08.2013    source источник
comment
Вы правы, предполагая, что должно быть создано больше перестановок. Я использовал ТОЧНО ту же конфигурацию с GIN и файлом formfactor.js и обычно получаю 16 разрешений. У вас настроено свойство user.agent в файле .gwt.xml?   -  person Chris Hinshaw    schedule 09.08.2013
comment
Привет, Крис. Я выполнил отладку до уровня, на котором я знаю, что получаю правильный форм-фактор, потому что мне удалось найти и отладить GWT JS в моем браузере. Я также отлаживал этот код в Safari, отлаживая свой iPad. Так что я уверен, что эта часть работает. И, как я уже упоминал, я получаю разные представления при работе в режиме разработки. Единственное, о чем я могу думать, это то, что, возможно, мои модули gin неправильно настроены в двух проектах. Вы использовали несколько проектов, когда делали это?   -  person Lavie Tobey    schedule 09.08.2013
comment
Нет, я использую один проект, как вы настроили свой gwt-maven-plugin для компиляции двух отдельных проектов? Все остальное выглядит правильно, возможно компилятор gwt не видит второй проект при запуске   -  person Chris Hinshaw    schedule 09.08.2013
comment
Подпроект выводит только файл JAR. Только основной проект компилируется gwt. Прямо сейчас у меня есть 2 подпроекта, которые на самом деле содержат представления, и общий проект с общим кодом. Эти 3 проекта выводят только JAR с исходным кодом. Четвертый проект содержит мой единственный класс EntryPoint. Это работает довольно хорошо, мое разделение кода правильно распознается компилятором GWT. До этого изменения у меня не было с этим проблем.   -  person Lavie Tobey    schedule 09.08.2013
comment
Когда вы удаляете строку <collapse-property name="formfactor" values="*"/> (из примера мобильного веб-приложения), компилируются ли тогда дополнительные перестановки?   -  person Chris Lercher    schedule 09.08.2013
comment
Я только что проверил, и у меня есть MobileGinjector, TabletGinjector и DesktopGinjector, и когда компилятор запускается, он создает 18 перестановок. Так что это должно быть проблемой, когда компилятор не видит ваш GinjectorTablet при компиляции. При компиляции у вас должно быть сгенерировано 12 разрешений. Используете ли вы maven для упаковки проекта или используете плагин eclipse gwt для упаковки своего проекта. Я всегда использую mvn вручную для package. У вас есть более 1 файла module.gwt.xml, и если это так, возможно, это необходимо настроить в конфигурации плагина. Ваш код выглядит правильно, кстати.   -  person Chris Hinshaw    schedule 09.08.2013
comment
Оно делает! И это даже работает, как ожидалось! Он выполняет только 12 разрешений (не 16, о которых вы упоминали ранее), но загружает правильный вид для моего ipad по сравнению с моим рабочим столом. Отправьте ответ, и я приму!   -  person Lavie Tobey    schedule 09.08.2013
comment
вау, хорошо поймать Крис, мой formfactor.gwt.xml не имеет свойства collaps   -  person Chris Hinshaw    schedule 09.08.2013
comment
Ха! Даже не осознавал, что было 2 разных помощника Криса. Благодаря вам обоим, я готов.   -  person Lavie Tobey    schedule 09.08.2013


Ответы (2)


Как упоминалось в комментариях, удаление строки

<collapse-property name="formfactor" values="*"/>

приводит к ожидаемому увеличению числа перестановок.

Тем не менее, непонятно, зачем это нужно, потому что обычно должна быть возможность свернуть любые свойства, которые вам нравятся - это просто означает, что каждый браузер должен загрузить больше кода, но все равно должен получить все, что ему нужно. Может быть ошибка.

person Chris Lercher    schedule 09.08.2013

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

person user1254554    schedule 21.02.2014