依赖注入在GWT 2.1中无法工作

3

我有一个新项目,其中使用了GWT视图,如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是ProductList的元素,使用UIBinder的@UIField标签。因此,注入将创建一个新对象,而不是使用UIBinder创建的对象。

我不得不重构我的代码,包括Presenter和事件总线,以便视图之间不需要直接引用(除了@UIField属性)。


请展示您获取ProductList对象的代码。 - pjulien
你的问题解决了吗? - Snekse
3个回答

4

我正在阅读Gin文档,以下是引用:

Gin的“魔法” Gin试图使注入变得简单,并尽可能地减少代码中的样板文件。为此,生成的代码包含一些幕后的魔法,这里进行了解释。

延迟绑定 Gin优化代码的一种方法是自动化GWT延迟绑定。因此,如果您注入一个通过延迟绑定绑定的接口或类1(但不是通过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()

啊,好的,自动生成的代码是这样生成的:GWT.create(RequiredClass.class),每当需要实例时。为了使此代码正常工作,必须要求RequiredClass具有可解析的@Injected或0参数构造函数。当使用GWT.create以这种方式进行延迟绑定代码生成时,我明白为什么总是难以返回单例。 - Zasz

1
Gin的asEagerSingleton()绑定已经破损了一段时间,并且注入了null。不确定修复何时进行,但我在v1.0上使用急切单例时遇到了问题。如果您感兴趣,请参见问题解释。我要么切换到常规的.in(Singleton.class)绑定,要么确保您正在使用Gin 1.5。

0

Ginjector是否正在创建ProductForm?我认为可能需要这样做才能填充注入的变量。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接