Как создать шину событий для ребенка/модуля в GWT?

Я работаю с проектом GWT, и возникает ситуация, когда я хочу создать отдельную шину событий для разных модулей в одном проекте. GWT предоставляет единую шину событий для всего проекта, которую мы можем использовать для подключения модулей. Теперь я не хочу использовать одну и ту же шину событий и хочу, чтобы шина событий для конкретного модуля могла обрабатывать события, связанные только с этим модулем. Есть ли механизм для достижения такого сценария? Позволяет ли GWT создавать несколько шин событий в одном проекте? если да, то как реализовать и использовать.?


person Pratik Rawlekar    schedule 24.05.2016    source источник
comment
Я думаю, вы имеете в виду mvp4g .. пожалуйста, укажите, используете ли вы какую-либо конкретную структуру или библиотеку в gwt или хотите решение, основанное на простом ванильном gwt   -  person Gautam    schedule 27.06.2016


Ответы (2)


Хотя это выглядит хорошей идеей, наличие нескольких EventBus усложнит ваш проект. И, как вы, возможно, знаете, JavaScript является однопоточным, и любой код Java, который вы пишете в GWT, будет преобразован в JavaScript. Таким образом, не будет никаких преимуществ, полученных от наличия Multiple EventBus.

Один против N EventBus

И если вы найдете время, прочитайте это. Это может быть интересно.

person Beniton    schedule 24.05.2016
comment
НЕТ, я думаю, что это не увеличит сложность, но выделит события, характерные для модуля, в будущем может возникнуть ситуация, когда мне придется создать новый проект, который будет включать только этот модуль. то есть модульно/функционально, я смогу создавать различные проекты на основе модулей с их шиной событий. - person Pratik Rawlekar; 24.05.2016
comment
@PratikRawlekar Но даже в этом случае вам не нужно иметь несколько шин событий. У нас был проект, в котором мы расширили EventBus и разделили его между модулями. Основная причина, по которой мы расширились, заключалась в том, чтобы инструментировать события, происходящие в приложении. - person Beniton; 24.05.2016
comment
Взгляните на mp4g (github.com/mvp4g/mvp4g/wiki/05 .-Разделение кода). каждый модуль имеет шину событий. вы можете определить, будет ли событие видимым глобально или только в вашем модуле. - person El Hoss; 24.05.2016
comment
Видимость @EI Hoss не является проблемой, я просто хочу отделить события, относящиеся к конкретному модулю, т. Е. EventBus будет содержать события, которые полезны только в этом модуле. - person Pratik Rawlekar; 24.05.2016
comment
@PratikRawlekar С какой именно проблемой вы сталкиваетесь при разделении событий, характерных для модулей? - person Beniton; 24.05.2016
comment
@Pratik: это то, что делает шина событий модуля. Если вы хотите, чтобы событие модуля было видно другим модулям, вы должны указать, что событие. - person El Hoss; 24.05.2016

Вы можете добиться этого с помощью инъекции джина, выполнив следующие шаги, если джин настроен

<сильный>1. Создайте шины событий как:

public interface EventBusOne extends EventBusWithLookup {}

public interface EventBusTwo extends EventBusWithLookup {}

<сильный>2. свяжите обе шины в модуле gin, созданном для приложения gwt, как:

bind(EventBusWithLookup.class).annotatedWith(Names.named("EventBusOne")).toProvider(EventBusOneProvider.class).in(Singleton.class);
bind(EventBusWithLookup.class).annotatedWith(Names.named("EventBusTwo")).toProvider(EventBusTwoProvider.class).in(Singleton.class);

<сильный>3. Создайте пользовательских поставщиков как:

public class EventBusOneProvider implements Provider<EventBusWithLookup> {
    @Override
    public EventBusWithLookup get() {
        return GWT.create(EventBusWithLookup.class);
    }
}

public class EventBusTwoProvider implements Provider<EventBusWithLookup> {
    @Override
    public EventBusWithLookup get() {
        return GWT.create(EventBusWithLookup.class);
    }
}

<сильный>4. Внедрите шину событий в своих докладчиков или где угодно, например:

@Inject
public void setEventBus(@Named("EventBusOne") Provider<EventBusWithLookup> eventBus) {
    this.eventBus = eventBus;
}

@Inject
public void setEventBus(@Named("EventBusTwo") Provider<EventBusWithLookup> eventBus) {
    this.eventBus = eventBus;
}
person vsbehere    schedule 26.05.2016