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

GWT小部件/库中的延迟绑定/GIN,gwt,widget,gwt-gin,Gwt,Widget,Gwt Gin,我对库/小部件中的延迟绑定和/或依赖注入的概念有点纠结。 我试图找出解决以下问题的最佳方法: 我想实现一个可视化小部件(composite),它接收并显示一些数据 我想将数据的检索方式与实际的可视化部分分开。因此,我添加了一个通用接口“DataSource”,如下所示: public interface DataSource { public void fetch(int start, int end, boolean getFeatures,

我对库/小部件中的延迟绑定和/或依赖注入的概念有点纠结。 我试图找出解决以下问题的最佳方法: 我想实现一个可视化小部件(composite),它接收并显示一些数据

我想将数据的检索方式与实际的可视化部分分开。因此,我添加了一个通用接口“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的数据源,我还添加了一个抽象类,该类实现了数据源接口,并在其默认构造函数中采用URL:

public abstract class HttpDataSource implements DataSource {
        protected String url;

        public HttpDataSource(String url) {
               this.url = url;
        }
}
My specific DataSouce扩展了这个抽象类并实现了接口的fetch方法:

public class MyDataSource extends HttpDataSource {

      public MyDataSource(String url) {
             super(url);
      }
}
这很有效。我可以创建MyDataSource类的实例,并将其传递给我的小部件的setter。 现在我想让这个小部件有点可配置。我知道这可以通过依赖注入或延迟绑定来实现

因此,一种方法是允许小部件的用户在模块XML文件中设置数据源(类似于在gwt日志库中的方式:)


但是,我不知道这是否可行,因为通过将url传递到MyDataSource的构造函数中,我有一个状态,我不确定这如何与延迟绑定一起工作。 另请注意:是否可以在模块的XML文件中配置url

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

我想另一个解决方案是在使用可视化小部件/库的父应用程序中使用依赖项注入(如何传递url等?我可能必须注入工厂?)

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

提前谢谢


Uemit

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


在这里你可以用很多种方法来使用杜松子酒。我建议让您的小部件通过其构造函数获取数据源实例。请参阅有关方法的说明。它比我在几个段落中所能解释的要好得多。

谢谢你的回答,但是为什么延迟绑定在这个例子中不可行呢?例如,gwt日志(请参阅我消息中的链接)在编译时使用延迟绑定来配置特定的记录器(ConsoleLogger、FirebugLogger)。我可以为我的数据源示例使用相同的东西,对吗?@Timeu数据源保存URL;像URL这样的东西在编译时无法确定,特别是当您考虑到这一点时。如果我使用的URL违反了SOP,您当然是对的,但如果我使用的是相对URL,是否也可以在模块的xml文件中配置URL?通常我在编译时已经知道我想在我的应用程序中使用哪个特定的数据源实现以及相应的URL。我把我的小部件想象成一个可部署的库,可以通过应用程序的XML文件(类似于gwt日志库)@Timeu进行配置,但是,当在代码中进行设置时,仍然会强制库的用户通过XML配置某些内容,这要自然得多。虽然延迟绑定是GWT的一个关键特性,但大多数开发人员,特别是那些刚开始使用GWT的人,不会理解您要实现什么。
<replace-with class="MyDataSource">
    <when-type-is class="DataSource" />
    <when-property-is name="source" value="MyDataSourceName" />
  </replace-with>