2011-03-04 55 views
3

不工作我有使用GinInjector,一个新的项目中,我使用GWT-查看样复合等依赖注入GWT 2.1

我已经注入在主菜单中(如下像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标签,以便将其注入将创建一个新的对象,而不是一个使用UiBinder的创建的产品列表的元素。

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

+0

请向我们展示您获取ProductList对象的代码。 – pjulien 2011-03-20 14:31:27

+0

你是否回答了你的问题? – Snekse 2011-03-22 17:51:39

回答

4

我是通过晶晶文档的工作:我会在这里引用它:

晶晶“魔术师” 晶晶试图使注射无痛的,从你的代码中删除尽可能多的样板。要做到这一点,生成的代码包含幕后的一些魔术,这在这里解释。

延迟绑定 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. 
    } 
} 

注:杜松子酒将不结合通过GWT.create在单范围中创建的实例。这不应该导致不必要的开销,因为延迟绑定生成器通常在其生成的代码中实现单例模式。

你可以在这个网址看到自己:http://code.google.com/p/google-gin/wiki/GinTutorial

它没有提到为什么单不能延迟绑定,并注入被自动生成。

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

这意味着测试puposes,你将需要拉GWT。创建成一个单独的方法,并在子类中覆盖它并使用它像测试:

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

getFactory().getProductList() 
+0

啊,好的,自动生成的代码是这样生成的:GWT.create(RequiredClass.class) 无论何时需要实例。为了使这个代码正常工作,RequiredClass必须有一个可解析的@Injected或0参数的构造函数。 当使用GWT.create以这种方式完成延迟绑定代码生成时,我明白了为什么它始终难以返回singleton。 – Zasz 2011-03-21 09:42:18

+0

谢谢!这帮了我很多! – adranale 2011-03-24 14:32:59

0

Ginjector是否创建了ProductForm?我想也许这需要使它填充注入的变量。

+0

是的!它不工作! – adranale 2011-03-04 09:57:54

1

杜松子酒的asEagerSingleton()结合被打破了好一阵子,并插入空。不知道修补程序何时进入,但我在v1.0上遇到了急切的单身问题。如果您有兴趣,请参阅the issuethe explanation。我要么切换到常规的.in(Singleton.class)绑定,要么确保您使用的是Gin 1.5。