2011-02-15 41 views
1

我在庫/小部件中使用延遲綁定和/或依賴注入的概念掙扎了一下。 我試圖想出以下問題的最佳方法: 我想實現一個可視化窗口小部件(複合),它接收一些數據並顯示它。GWT小部件/庫中的延遲綁定/ GIN

我想分開實際可視化部分的數據檢索方式。所以我增加了一個通用接口「數據源」,它看起來是這樣的:

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

,我添加setter到我的小工具:

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

在奧得河,支持斷點續傳像數據源我還添加了一個抽象類它實現了DataSource接口,並需要一個URL在其默認的構造函數:

public abstract class HttpDataSource implements DataSource { 
     protected String url; 

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

我的具體DataSouce擴展這個抽象類和實現接口的取方法:

public class MyDataSource extends HttpDataSource { 

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

這很好。我可以創建一個MyDataSource類的實例,將它傳遞給我的小部件的setter。 現在我想讓這個小部件有點可配置。我知道這可以通過依賴注入或延遲綁定來完成。

所以一個辦法是讓小部件的用戶設置模塊XML文件中的數據源(類似它在GWT-日誌庫做的方式: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?

我也很擔心,如果誰使用這個小工具的人/庫可以實現自己的數據源,並把它傳遞給小部件(不將其與延遲綁定干擾?)

我想另一個解決方案是使用在使用可視化小部件/庫的父應用程序中的依賴注入(如何傳遞url等等?我可能必須注入一個工廠?)

這兩個解決方案中的哪一個更好,感覺使用延遲綁定或GIN來解決這個問題?

在此先感謝

Uemit

回答

2

你應該用杜松子酒,沒有延遲綁定。 「延遲綁定」是GWT編譯器用來根據一組參數創建和選擇一個類的特定實現的技術。實質上,延遲綁定是Google Web Toolkit對Java反射的答案。 (從Coding Basics)在你的場景中,你並沒有試圖在編譯時提供基於一組參數的實現,而是運行時。

您可以通過多種方式在此處使用GIN。我建議讓你的Widget通過它的構造函數DataSource實例。請參閱GinTutorial關於如何做到這一點。它比我在幾段中的解釋要好得多。

+0

感謝您的回覆,但爲什麼不應該延遲綁定在這個例子中可行?例如gwt-log(參見我的消息中的鏈接)使用延遲綁定在編譯期間配置特定的Logger(ConsoleLogger,FirebugLogger)。對於我的DataSource示例,我可以擁有相同的東西嗎? –

+0

@Timeu數據源保存URL;在編譯時無法確定URL之類的東西,特別是當你考慮[同源策略](http://en.wikipedia.org/wiki/Same_origin_policy)時。 –

+0

當然,如果我使用違反SOP的URL,但如果我使用相對URL,不應該也可以在模塊的xml文件中配置URL嗎?通常我在編譯期間已經知道哪個特定的DataSource實現有我想要在我的應用程序中使用的對應URL。 –