2

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

在此先感谢,马库斯

4

1 回答 1

3

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

可以使用 GIN 将一些东西注入到您的小部件中。

想一想:GIN 是一个独立的依赖注入框架,你只要问你需要什么,GIN 就会创建一个解析依赖关系的 bean。仅当从 Ginjector 实例获得对象时才会执行注入。UI binder 是一个声明式 UI 框架,它基于您的 XML 创建小部件(并做了很多其他的事情,但我们现在可以忽略它)。

所以如果我们想使用 GIN 将依赖注入到 Widget 中,则意味着 Widget 应该由 GIN 创建,而不是 UiBinder。UiBinder 必须使用 GIN 提供的实例。是否可以?是的,UiBinder 通过以下方式允许它:

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

或者

使用@UiFactory

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

于 2012-01-04T19:06:22.123 回答