GWT小部件/库中的延迟绑定/ GIN

时间:2011-02-15 09:49:42

标签: gwt widget gin

我在库/小部件中延迟绑定和/或依赖注入的概念有点挣扎。 我尝试提出以下问题的最佳方法: 我想实现一个可视化小部件(复合),它接收一些数据并显示它。

我想分离从实际可视化部分检索数据的方式。所以我添加了一个通用接口“DataSource”,如下所示:

public interface DataSource {
    public void fetch(int start, int end, boolean getFeatures, 
                         DataSourceCallback callback);  
}

我在我的Widget中添加了一个setter:

public void setDataSource(DataSource source) { this.source = source}

在oder中支持http像数据源我还添加了一个抽象类,它实现了DataSource接口并在其默认构造函数中获取了一个URL:

public abstract class HttpDataSource implements DataSource {
        protected String url;

        public HttpDataSource(String url) {
               this.url = url;
        }
}

我的特定DataSouce扩展了这个抽象类,并实现了接口的fetch方法:

public class MyDataSource extends HttpDataSource {

      public MyDataSource(String url) {
             super(url);
      }
}

这很有效。我可以创建一个MyDataSource类的实例将它传递给我的小部件的setter。 现在我想让窗口小部件可配置。我知道这可以通过依赖注入或延迟绑定来完成。

因此,一种方法是允许窗口小部件的用户在模块XML文件中设置DataSource(类似于在gwt-log库中完成的方式:http://code.google.com/p/gwt-log/source/browse/trunk/Log/src/com/allen_sauer/gwt/log/gwt-log-impl.gwt.xml

<replace-with class="MyDataSource">
    <when-type-is class="DataSource" />
    <when-property-is name="source" value="MyDataSourceName" />
  </replace-with>

但是我不知道这是否可能,因为通过将url传递给MyDataSource的构造函数,我有一个状态,我不确定这是如何使用延迟绑定的。 请注意:是否可以在模块的XML文件中配置URL?

我也很担心使用这个小部件/库的人是否可以实现自己的DataSource并将其传递给小部件(它是否会干扰延迟绑定?)

我想另一种解决方案是在父应用程序中使用依赖注入,它使用可视化窗口小部件/库(如何传递URL等等?我可能需要注入工厂?)

这两个解决方案中哪一个更好,一般来说使用延迟绑定或GIN来解决这个问题是有意义的吗?

提前致谢

Uemit

1 个答案:

答案 0 :(得分:2)

您应该使用GIN,而不是延迟绑定。延迟绑定是“GWT编译器使用的一种技术,用于根据一组参数创建和选择类的特定实现。本质上,延迟绑定是Google Web Toolkit对Java反射的回答。” (来自Coding Basics)在您的场景中,您不是在编译时尝试基于一组参数提供实现,而是尝试运行时。

您可以通过多种方式在此处使用GIN。我建议让你的Widget通过它的构造函数获取DataSource实例。有关如何执行此操作的信息,请参阅GinTutorial。它在解释它方面比我在几个段落中做得好得多。