Внедрение асинхронной службы GWT Gin

У меня есть вопрос об использовании Gin для внедрения службы GWT Async RPC.

У меня есть два класса, использующие один и тот же сервис Async:

class TheViewA {    
    @Inject
    public TheViewA(MyServiceAsync myServiceASync) {
        ....
    }
}


class TheViewB {
    @Inject
    public TheViewB(MyServiceASync myServiceASync) {
        ....
    }
}

Это прекрасно работает. Однако я обнаружил, что это вызовет внутренний вызов GWT:

GWT.create(MyServiceASync.class) 

дважды на каждую инъекцию. Я не знаю, в чем недостаток этого, но я думаю, что они оба могут использовать один экземпляр MyServiceAsync.

Может кто-нибудь сказать мне, как настроить Gin (Guice), чтобы для обеих инъекций создавался только один экземпляр MyServiceAsync?

Или можно ли создавать отдельные экземпляры для обеих инъекций и почему?

Большое спасибо.


person Community    schedule 16.03.2013    source источник
comment
Было бы лучше иметь одноэлементный экземпляр класса asyn с точки зрения производительности. Я не уверен насчет джина.   -  person appbootup    schedule 16.03.2013
comment
@SSR, можешь уточнить? Скомпилированный код асинхронного кода удаленной службы довольно прост, я не уверен, что было бы лучше в создании меньшего количества экземпляров...   -  person Colin Alworth    schedule 16.03.2013
comment
Мы профилировали и интерпретировали, что создание асинхронной удаленной службы требует времени (около пары лет назад), и перешли к одноэлементному подходу.   -  person appbootup    schedule 17.03.2013


Ответы (1)


Когда дело доходит до внедрения, если Gin не находит привязку для данного типа, он автоматически возвращается к GWT.create() для создания экземпляра. Вот почему ClientBundle/GWT-RPC/i18n и им подобные просто работают, и вам не нужно привязывать их к собственному расширению AbstractGinModule.

Конечно, когда Gin находит другую инъекцию того же типа, она внедряет другой экземпляр. Чтобы создать и внедрить одноэлементный экземпляр, просто привяжите свой GWT-RPC асинхронный сервисный интерфейс к @Singleton области видимости. Нравится:

public class YourModule extends AbstractGinModule {
  @Override
  protected void configure() {
    bind(MyServiceAsync.class).in(Singleton.class);
  }
}

Или вы можете создать Provider<MyServiceAsync>, который всегда возвращает одноэлементный экземпляр, но предыдущий подход намного проще.

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

person Andrea Boscolo    schedule 16.03.2013
comment
И чтобы ответить на другой вопрос, да, создавать несколько экземпляров RPC нормально — они не хранят никакого состояния, поэтому создание большего количества не потребует заметного объема памяти. Добавление области Singleton - это правильный способ избежать создания других экземпляров, но в этом случае я действительно не стал бы беспокоиться об этом - я никогда не слышал и не видел причин, чтобы предпочесть одиночный экземпляр этого. Напротив, RequestFactory требует настройки, которой вы могли бы избежать, но я не уверен, что она того стоит. - person Colin Alworth; 16.03.2013