依赖注入不适用于gwt 2.1

时间:2011-03-04 09:16:26

标签: gwt dependency-injection gwt2 gin

我有一个新项目,我正在使用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属性)。

3 个答案:

答案 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 issuethe explanation。我要么切换到常规的.in(Singleton.class)绑定,要么确保你使用的是Gin 1.5。

答案 2 :(得分:0)

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