gwt - 依赖注入(inject)在 gwt 2.1 中不起作用

标签 gwt dependency-injection gwt2 gwt-gin

我有一个新项目,我在其中使用 GWT-Views,例如 Composite 等。

我已使用 GinInjector 将项目注入(inject)主菜单(如下面的 ProductList)。这很好用!

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

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 的一个元素,因此注入(inject)它会创建一个新对象,而不是使用 UIBinder 创建的对象。

我不得不重组我的代码以包括演示者和事件总线,这样就不需要 View 之间的直接引用(@UIField 属性除外)。

最佳答案

我正在研究 Gin 文档:我将在此处引用它:

Gin “魔法” Gin 试图让注入(inject)变得无痛,并尽可能多地从您的代码中删除样板文件。为此,生成的代码在幕后包含了一些魔法,这在此处进行了解释。

延迟绑定(bind) Gin 优化代码的一种方法是通过自动化 GWT 延迟绑定(bind)。因此,如果您注入(inject)通过延迟绑定(bind)(而不是通过 Guice/Gin 绑定(bind))绑定(bind)的接口(interface)或 class1,Gin 将在内部调用 GWT.create 并注入(inject)结果。一个示例是 GWT 消息和常量(用于国际化目的):

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 不会在单例范围内绑定(bind)通过 GWT.create 创建的实例。不过,这不应造成不必要的开销,因为延迟绑定(bind)生成器通常会在其生成的代码中实现单例模式。

您可以在此 URL 中亲自查看:http://code.google.com/p/google-gin/wiki/GinTutorial

它没有提到为什么单例不能通过延迟绑定(bind)自动生成和注入(inject)。

您可以通过在构造函数中使用 GWT.create(YourFactoryInterface.class).getProductList() 手动创建来解决此问题。

这意味着为了测试目的,您需要将 GWT.create 拉入一个单独的方法并在子类中覆盖它并将其用于测试,例如:

YourFactoryInterface getFactory() {
  return GWT.create(YourFactoryInterface.class)
}

getFactory().getProductList()

关于gwt - 依赖注入(inject)在 gwt 2.1 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5191772/

相关文章:

java - 如何通过单击单元格表中的单元格来打开弹出面板?

java - 在 GWT 中设计图形用户界面

java - GWT:处理传入的 JSON 字符串

java - 如何在 Smart GWT 中创建 header

java - 什么类转换为 GWT 中的 java 脚本?

ruby-on-rails - Ruby/Rails 依赖注入(inject)

java - 在 GWTP 中的 RPC 调用期间显示 "loading indicator"的最简单方法是什么?

symfony - Symfony 服务收集不同方法之间的差异

dependency-injection - 如何在 ES6 中使用 angular2 DynamicComponentLoader?

java - GWT 2.1 编辑器框架如何支持原始类型?