3

我有一个新项目,我在其中使用 GWT 视图,如 Composite 等。

ProductList我已经使用 GinInjector注入了主菜单中的项目(如下所示)。这很好用!

我想在某个地方从一个小组件引用我的主菜单中的一个项目,以便对其进行更新。我尝试以这种方式注入它:

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 属性除外)。

4

3 回答 3

4

我正在研究 Gin 文档:我会在这里引用它:

Gin "Magic" Gin 试图让注射变得无痛,并从您的代码中删除尽可能多的样板。为此,生成的代码包含了一些幕后的魔法,这里对此进行了解释。

延迟绑定 Gin 优化代码的一种方法是自动化 GWT 延迟绑定。因此,如果您通过延迟绑定(但不是通过 Guice/Gin 绑定)注入绑定的接口或 class1,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 创建的实例。但这不应该导致不必要的开销,因为延迟绑定生成器通常在其生成的代码中实现单例模式。

您可以在此 URL 中亲自查看: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()
于 2011-03-21T09:40:24.240 回答
1

Gin 的asEagerSingleton()绑定被破坏了很长一段时间,并且正在注入 null。不确定何时修复,但我在 v1.0 上遇到了急切单例的问题。如果您有兴趣,请参阅问题说明。我要么切换到常规.in(Singleton.class)绑定,要么确保您使用的是 Gin 1.5。

于 2011-03-21T10:22:25.480 回答
0

Ginjector 是否在创建 ProductForm?我认为也许需要让它填充注入的变量。

于 2011-03-04T09:41:07.453 回答