【问题标题】:Use gwt ui-binding in conjunction with google-gin将 gwt ui-binding 与 google-gin 结合使用
【发布时间】:2012-01-04 18:52:23
【问题描述】:

有没有办法在通过 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 的概念,如果是这样,任何提示都非常感谢。

提前致谢, 马库斯

【问题讨论】:

标签: gwt uibinder gwt-gin


【解决方案1】:

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

但是

可以使用 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 .

【讨论】:

  • 您好,谢谢您的回答。 UiFactory 正是我正在寻找的 :) 视图,现在注入了一个 Provider。然后我用 UiFactory 注释了一个方法,它使用 this 提供程序提供了一个 Foo 的实例。但是根据您的第一句话,为什么这是糟糕的设计?为了实现小部件的解耦,但在这些小部件中仍然有一个 EventBus 来对用户交互做出反应,还有什么可以做得更好?
  • 小部件通常是低级的,非常通用的东西,通常为了创建一个小部件,你只需要配置真正必要的东西。例如,我无法想象为什么按钮或 CellList 需要依赖注入或 EventBus。它们需要非常可重用。并且它们的所有依赖项不应该通过依赖注入来管理,而应该通过 View 来管理。基本上依赖注入 fwk 不应该用于所有代码,而是用于一些高级抽象(如 Views、Presenter、Services 等)。PS:这是我的个人观点,可能很多人不同意
  • 我同意小部件的一般观点,就我而言,虽然它在技术上是一个小部件(因为它扩展了 Composite),但它应该被视为特定应用程序上下文中的可重用组件(a相当复杂的小部件,而不仅仅是一个上下文无关的 ui 控件)与用户交互元素,因此它需要一个 EventBus 等。但正如你所说,意见可能会有所不同,感谢讨论:)
  • 我无法想象没有 ClientBundle 工具的应用程序 - 它以非常严格的方式为我处理所有 CSS 并具有最高级别的错误保护:在编译时失败。自定义小部件从相关的 ClientBundle 实例中获取样式。混合 GWT.create() 和 @Inject 是一种不好的做法 imo,因此我更喜欢注入所有内容,包括我的 ClientBundle。因此,我在相关的 gin 配置模块中创建了相应的单例绑定。这个简单的逻辑没有留下任何怀疑小部件是否是注入对象的空间。他们是。
猜你喜欢
  • 2011-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多