我有一个关于使用Gin注入GWT异步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实例吗?
或者为两次注射创建单独的实例是否可以?为什么?
非常感谢。
答案 0 :(得分:1)
当涉及到注入时,如果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>
,但之前的方法要简单得多。
通常首选在整个应用程序中注入单例异步实例。