【问题标题】:Dependency injection not working in gwt 2.1依赖注入在 gwt 2.1 中不起作用
【发布时间】:2011-03-24 22:36:01
【问题描述】:

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

【问题讨论】:

  • 请向我们展示您获取 ProductList 对象的代码。
  • 您的问题得到解答了吗?

标签: gwt dependency-injection gwt2 gwt-gin


【解决方案1】:

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

杜松子酒“魔法” 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 创建的实例。但这不会造成不必要的开销,因为延迟绑定生成器通常在其生成的代码中实现单例模式。

您可以在此网址中亲自查看: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 以这种方式生成延迟绑定代码时,我明白为什么总是很难返回单例。
  • 谢谢!这对我帮助很大!
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    Ginjector 是否在创建 ProductForm?我认为可能需要它来填充注入的变量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-12
      相关资源
      最近更新 更多