Использование @Singleton в двух экземплярах Ginjector - PullRequest
2 голосов
/ 25 января 2012

У меня проблемы с циркулярной зависимостью в наборе проектов GWT («Основной проект», «Проект виджетов», «Проект сервисного адаптера»).Основные справочные виджеты и сервисные адаптеры.Виджеты справочных сервисных адаптеров.И тут возникает проблема.Я хотел бы использовать EventBus практически везде, вводится.Где я должен разместить свой интерфейс Ginjector?

Он должен быть применим из каждого проекта и должен ссылаться на классы из каждого проекта, чтобы иметь возможность вводить классы из разных проектов.Это явно не компилируется.

Я думал об использовании отдельного Ginjector для виджетов и один только для EventBus.Если два отдельных Ginjectors используют два отдельных GinModules, каждый из которых содержит @Singleton EventBus привязок, два получателя будут возвращать одинаковые EventBus экземпляры или нет?

Примечание: это вопрос Gin, а не Guice.

Ответы [ 2 ]

3 голосов
/ 25 января 2012

Самый простой способ, который я могу придумать, - это создать EventBus как синглтон в отдельном инжекторе (или сделать его статическим конечным полем в некотором классе), а затем использовать @Provides в других инжекторах, чтобы получить доступ к этому конкретному EventBus экземпляр.

1 голос
/ 26 января 2012

Я делаю по одному модулю для каждого логического раздела (по одному или более для каждого проекта), а затем один узел доступа, доступный с точки входа, ссылаясь на все необходимые ему модули. Все (почти) за точкой входа затем создается Джином, поэтому в него можно будет вставлять поля.

Каждый новый Ginjector, который является GWT.create ', будет иметь свой собственный набор синглетонов, поэтому важно создать только один корневой ginjector. Этот инжектор можно внедрить в другие части кодовой базы, но, как правило, он делает код более читабельным, если вы этого не сделаете.

Если вам нужно передать экземпляры EventBus или что-то еще объектам, не созданным Джином, есть несколько вариантов. Первый - создать свой собственный экземпляр Provider и связать его в модуле (или создать методы в модуле, помеченном @Provides). Второе - создать в ginjector методы, которые принимают один параметр и возвращают void - Gin сможет внедрить все поля и сеттеры для этого объявленного типа. В приведенном ниже примере будут добавлены только поля и сеттеры, помеченные @Inject в MyWidget и его суперклассах - он также не будет искать подклассы.

void injectMyWidget(MyWidget widget);
...