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

Другие вопросы по тегам