我有一个新项目,我正在使用GWT-Views,如Composite等。
我已使用GinInjector在主菜单中注入了项目(如下面的ProductList
)。这很好用!
在某个地方,我想从一个小组件到我主菜单中的项目的引用,以便更新它。我试着用这种方式注射它:
public class ProductForm extends Composite {
...
@Inject
ProductList list;
....
}
但是当我使用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属性)。
答案 0 :(得分:4)
我正在处理Gin文档:我会在这里引用它:
杜松子酒“魔术师” 杜松子酒试图使注射无痛,并从代码中尽可能多地删除样板。为此,生成的代码包含幕后的一些魔法,这里将对此进行解释。延迟绑定 Gin优化代码的一种方法是自动化GWT延迟绑定。因此,如果您通过延迟绑定注入接口或class1(但不通过Guice / Gin绑定),Gin将在内部调用GWT.create并注入结果。一个例子是GWT消息和常量(用于i18n目的):
public interface MyConstants extends Constants {
String myWords();
}
public class MyWidget {
@Inject
public MyWidget(MyConstants myconstants) {
// The injected constants object will be fully initialized -
// GWT.create has been called on it and no further work is necessary.
}
}
注意:Gin不会绑定通过单例作用域中的GWT.create创建的实例。这不应该导致不必要的开销,因为延迟绑定生成器通常在生成的代码中实现单例模式。
您可以在此网址中找到自己:http://code.google.com/p/google-gin/wiki/GinTutorial
没有提到为什么单身不能通过延迟绑定自动生成并注入。
您可以使用构造函数中的GWT.create(YourFactoryInterface.class).getProductList()
通过手工创建来解决此问题。
这意味着对于测试目的,您需要将GWT.create拉入单独的方法并在子类中覆盖它并将其用于测试,如:
YourFactoryInterface getFactory() {
return GWT.create(YourFactoryInterface.class)
}
和
getFactory().getProductList()
答案 1 :(得分:1)
Gin的asEagerSingleton()
绑定被打破了很长一段时间,并注入了null。不确定修复程序何时进入,但我在v1.0上遇到了热切的单身人士问题。如果您有兴趣,请参阅the issue或the explanation。我要么切换到常规的.in(Singleton.class)
绑定,要么确保你使用的是Gin 1.5。
答案 2 :(得分:0)
Ginjector是否正在创建ProductForm?我想也许需要让它填充注入的变量。