将gwt ui-binding与google-gin结合使用

时间:2012-01-04 18:52:23

标签: gwt uibinder gin

有没有办法在窗口小部件中使用依赖注入,这是通过ui绑定创建的?

假设我有一个简单的小部件(在com.example.client.ui.widget包中):

public class Foo extends Composite {

    private final EventBus eventBus;

    @Inject
    public Foo(final EventBus eventBus) {
        this.eventBus = eventBus;
        // create ui
    }
}

然后我有一个通过使用这个小部件的ui绑定定义的视图。例如:

<ui:UiBinder xmlns:ui='urn:ui:com.google.gwt.uibinder'
    xmlns:g='urn:import:com.google.gwt.user.client.ui'
    xmlns:app='urn:import:com.example.client.ui.widget'>

    <g:HorizontalPanel>
        <app:Foo/>
    </g:HorizontalPanel>
</ui:UiBinder>

这样做不起作用,因为ui绑定中使用的小部件的无参数构造函数约束。但如果有一个@Inject注释,如果GWT编译器只使用GIN,那不是很好吗?或者这可以通过其他方式完成吗?也许我完全错过了GIN和GWT的概念,如果有的话,任何提示都非常受欢迎。

提前致谢, 马库斯

1 个答案:

答案 0 :(得分:3)

如果您需要依赖注入小部件,那么您做错了。

BUT

可以使用GIN将一些内容注入到小部件中。

考虑以下事项:  GIN是一个独立的依赖注入框架,你只需要问你需要什么,GIN将创建一个解析了依赖关系的bean。只有在从Ginjector实例获得对象时才会执行注入。  UI binder是一个声明性UI的框架,它根据你的XML创建小部件(并做了很多其他的东西,但我们现在可以忽略它。)

因此,如果我们想使用GIN将依赖注入Widget,则意味着小部件应该由GIN创建,而不是UiBinder。 UiBinder必须使用GIN提供的实例。可能吗? 是的,UiBinder允许它:

在小部件字段

上使用注释@UiField(provided = true)

使用@UiFactory

所以你需要做的是在你的GinModule中为widget创建绑定,通过Ginjector获取它的实例或者为widget添加提供者,而不是通过@UiField(provided = true)或@UiFactory将widget的实例提供给UiBinder 。