Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将gwt ui绑定与google gin结合使用_Gwt_Uibinder_Gwt Gin - Fatal编程技术网

将gwt ui绑定与google gin结合使用

将gwt ui绑定与google gin结合使用,gwt,uibinder,gwt-gin,Gwt,Uibinder,Gwt Gin,有没有一种方法可以在通过ui绑定创建的小部件中使用依赖项注入 假设我有一个简单的小部件(在com.example.client.ui.widget包中): 然后我有一个视图,它是通过使用这个小部件的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:

有没有一种方法可以在通过ui绑定创建的小部件中使用依赖项注入

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

然后我有一个视图,它是通过使用这个小部件的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,那不是很好吗?或者这可以通过其他方式实现吗?也许我完全错过了杜松子酒和GWT的概念,如果是这样,任何提示都非常感谢

提前感谢,,
Markus

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

但是

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

考虑以下几点: GIN是一个独立的依赖项注入框架,您只需询问您需要什么,GIN将创建一个解决依赖项的bean。只有从Ginjector实例获取对象时,才会执行注入。 UI活页夹是一个声明式UI的框架,它基于XML创建小部件(并做了许多其他工作,但我们现在可以忽略它)

所以,若我们想使用GIN将依赖注入到小部件中,这意味着小部件应该由GIN而不是UiBinder创建。UiBinder必须使用杜松子酒提供的Instance。可能吗? 是的,它通过以下方式实现:

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

使用


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

很明显,通过ui绑定本身声明的视图绑定在gin配置中。请参见Hi jusio,感谢您的回答。UiFactory正是我想要的:)视图现在注入了一个提供者。然后我用UiFactory注释了一个方法,该方法使用this提供程序提供了一个Foo实例。但是根据你的第一句话,为什么这个设计不好?为了实现小部件的解耦,还有什么可以做得更好,但这些小部件中仍然有一个事件总线来对用户交互做出反应?小部件通常是低级的、非常通用的东西,通常为了创建小部件,您只需要配置真正必要的东西。我真的无法想象为什么按钮或单元格列表需要依赖注入或事件总线。它们需要非常可重用。它们的所有依赖项都不应该通过依赖项注入来管理,而应该通过视图来管理。基本上,依赖注入fwk不应该用于所有代码,而是用于一些高级抽象(如视图、演示者、服务等)。PS:这是我个人的观点,很多人可能不同意我对一般小部件的观点,在我的情况下,虽然它在技术上是一个小部件(因为它扩展了复合),它应该被视为特定应用程序上下文(一个相当复杂的小部件,而不仅仅是一个与上下文无关的ui控件)中的一个可重用组件,具有用户交互元素,因此它需要一个EventBus等。但正如您所说,意见可能会有所不同,感谢讨论:)我无法想象我的应用程序没有ClientBundle功能——它以非常严格的方式为我处理所有CSS,并具有最高级别的bug保护:在编译时失败。自定义小部件从相关的ClientBundle实例获取其样式。在我看来,混合使用GWT.create()和@Inject是一种糟糕的做法,因此我更喜欢注入所有东西,包括我的ClientBundle。因此,我在相关的gin配置模块中创建了相应的单例绑定。这个简单的逻辑没有让人怀疑widget是否是注入的对象。他们是。
<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>