gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 15:46:22 26 4
gpt4 key购买 nike

我有一个新项目,我在其中使用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com