我有一个关于使用Gin注入GWT异步RPC服务的问题。

我有两个类都使用相同的异步服务:

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


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


这很好。但是,我发现这将导致GWT内部调用:

GWT.create(MyServiceASync.class)


每次注射两次。我不知道这样做的缺点是什么,但是我认为它们可以共享一个MyServiceAsync实例。

有人可以告诉我如何配置Gin(Guice),以便只为两个注入创建MyServiceAsync的一个实例吗?

还是可以为注入创建单独的实例,为什么?

非常感谢。

最佳答案

注入时,如果Gin找不到给定类型的绑定,它将自动回退到GWT.create()来创建实例。这就是为什么ClientBundle / GWT-RPC / i18n之类的东西只是Just Works,而不必将它们绑定到您自己的AbstractGinModule扩展名中的原因。

当然,当Gin找到另一个相同类型的注入时,它将注入另一个实例。要创建和注入单例实例,只需将您的GWT-RPC异步服务接口绑定到@Singleton范围。像这样:

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


或者,您可以创建一个总是返回单例实例的Provider<MyServiceAsync>,但是以前的方法要简单得多。

通常首选在整个应用程序中注入单例异步实例。

07-24 19:10
查看更多