【问题标题】:Deferred Binding/GIN in GWT widgets/librariesGWT 小部件/库中的延迟绑定/GIN
【发布时间】:2011-02-15 09:49:41
【问题描述】:

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

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

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

我在我的小部件中添加了一个 setter:

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

为了支持类似 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 类的实例,将它传递给我的小部件的设置器。 现在我想让小部件有点可配置。我知道这可以通过依赖注入或延迟绑定来完成。

因此一种方法是允许小部件的用户在模块 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 来解决这个问题是否有意义?

提前致谢

发射

【问题讨论】:

    标签: gwt widget gwt-gin


    【解决方案1】:

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

    您可以通过多种方式在这里使用 GIN。我建议让您的 Widget 通过它的构造函数获取 DataSource 实例。请参阅GinTutorial 了解如何做到这一点。它比我在几段中的解释做得更好。

    【讨论】:

    • 感谢您的回复,但为什么延迟绑定在此示例中不可行?例如 gwt-log(请参阅我的消息中的链接)在编译期间使用延迟绑定来配置特定的 Logger(ConsoleLogger、FirebugLogger)。我的 DataSource 示例可以有同样的东西吗?
    • @Timeu 数据源保存URL;在编译时无法确定 URL 之类的东西,尤其是当您考虑 Same Origin Policy 时。
    • 如果我使用违反 SOP 的 URL,你当然是对的,但如果我使用相对 URL,是否也可以在模块的 xml 文件中配置 URL?通常我在编译期间已经知道我想在我的应用程序中使用哪个特定的 DataSource 实现以及相应的 URL。
    • 我把我的小部件想象成一个可部署的库,可以通过应用程序的 XML 文件进行配置(类似于 gwt-log 库)
    • @Timeu 这是可能的,但是当在代码中设置它更自然时,您仍然强制您的库的用户通过 XML 配置某些东西。虽然延迟绑定是 GWT 的一个关键特性,但大多数开发人员,尤其是那些刚开始使用 GWT 的开发人员,并不了解您要完成的工作。
    猜你喜欢
    • 2013-08-09
    • 2014-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-23
    • 1970-01-01
    • 2014-09-11
    • 1970-01-01
    相关资源
    最近更新 更多