依赖注入在GWT2.1中不起作用
我有一个新项目,我正在使用GWT视图,比如复合视图等 我已经使用GinInjector注入了主菜单中的项目(如下面的依赖注入在GWT2.1中不起作用,gwt,dependency-injection,gwt2,gwt-gin,Gwt,Dependency Injection,Gwt2,Gwt Gin,我有一个新项目,我正在使用GWT视图,比如复合视图等 我已经使用GinInjector注入了主菜单中的项目(如下面的ProductList)。这个很好用 在某个地方,我想从一个小组件引用到我主菜单中的一个项目,以便更新它。我尝试以这种方式注入它: public class ProductForm extends Composite { ... @Inject ProductList list; .... } 但是当我使用列表时,我总是得到null。其中,Produc
ProductList
)。这个很好用
在某个地方,我想从一个小组件引用到我主菜单中的一个项目,以便更新它。我尝试以这种方式注入它:
public class ProductForm extends Composite {
...
@Inject
ProductList list;
....
}
但是当我使用列表时,我总是得到null
。其中,ProductList
的定义如下:
public class MyModule extends AbstractGinModule {
...
@Override
protected void configure() {
bind(ProductList.class).asEagerSingleton();
bind(ProductForm.class).asEagerSingleton();
}
...
}
知道我做错了什么吗
解决方案:
我没有提到ProductForm是使用UIBinder的@UIField标记的ProductList元素,因此注入它将创建一个新对象,而不是使用UIBinder创建的对象
我必须重新构造代码,以包含演示者和事件总线,这样就不需要在视图之间直接引用(除了@UIField属性)。Ginject是否正在创建ProductForm?我认为可能需要这样做才能使它填充注入的变量。我正在处理Gin文档:我将在这里引用它:
杜松子酒“魔力”
Gin试图让注射变得无痛,并从代码中删除尽可能多的样板文件。要做到这一点,生成的代码包括一些幕后的魔法,这里将对此进行解释
延迟绑定
Gin优化代码的一种方法是自动化GWT延迟绑定。因此,如果通过延迟绑定(但不是通过Guice/Gin绑定)注入接口或类1绑定,Gin将在内部调用GWT.create并注入结果。一个例子是GWT消息和常量(用于i18n目的):
注意:Gin不会绑定在singleton范围内通过GWT.create创建的实例。不过,这不会导致不必要的开销,因为延迟绑定生成器通常在其生成的代码中实现单例模式。
您可以在此URL中自己查看:
它没有提到为什么不能通过延迟绑定和注入自动生成单例
您可以通过手动创建来修复此问题,方法是在构造函数中使用GWT.create(YourFactoryInterface.class).getProductList()
这意味着对于测试pupose,您需要将GWT.create拉入一个单独的方法中,并在子类中重写它,然后将其用于测试,如:
YourFactoryInterface getFactory() {
return GWT.create(YourFactoryInterface.class)
}
及
Gin的asEagerSingleton()
绑定被破坏了很长一段时间,并注入null。不确定修复何时开始,但我在v1.0上遇到了一些问题。如果你感兴趣的话,看看或者。我要么切换到(Singleton.class)
绑定中的常规,要么确保您使用的是Gin 1.5。啊,好吧,只要需要实例,自动生成的代码就会这样生成:GWT.create(RequiredClass.class)。要使此代码正常工作,RequiredClass必须具有可解析的@Injected或0参数构造函数。当使用GWT.create以这种方式生成延迟绑定代码时,我明白了为什么总是返回singleton很困难。谢谢!这对我帮助很大!请向我们展示您获取ProductList对象的代码。您的问题得到回答了吗?
YourFactoryInterface getFactory() {
return GWT.create(YourFactoryInterface.class)
}
getFactory().getProductList()