将gwt-ui绑定与google-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绑定中使用的小部件没有arg构造函数约束。但是,如果GWT编译器在有@Inject注释的情况下只使用GIN,那不是很好吗?或者这可以通过其他方式实现吗?也许我完全错过了GIN和GWT的概念,如果是这样的话,任何提示都将不胜感激。

提前感谢,Markus

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

但是

可以使用GIN来向小部件中注入一些东西。

请考虑以下内容:GIN是一个独立的依赖注入框架,你只需要问你需要什么,GIN就会创建一个解析了依赖关系的bean。只有从Gijector实例中获得对象时,才会执行注入。UI绑定器是一个声明性UI的框架,它基于XML创建小部件(并做一些其他事情,但我们现在可以忽略它)。

所以,如果我们想使用GIN将依赖项注入Widget,这意味着Widget应该由GIN创建,而不是由UiBinder创建。UiBinder将不得不使用GIN提供的instace。有可能吗?是的,它UiBinder允许它通过:

在窗口小部件字段上使用注释@UiField(provided=true)

使用@UiFactory

因此,您需要做的是在GinModule中为小部件创建绑定,通过Gijector获取它的实例或为小部件注入提供程序,然后您可以通过@UiField(provided=true)或@UiFactory将小部件的实例提供给UiFinder。

相关内容

  • 没有找到相关文章

最新更新