2011-02-15 10 views
1

私は図書館/ウィジェットにおける繰延結合および/または依存性注入の概念に少し苦労しています。 私は次の問題のための最善のアプローチを考え出します: いくつかのデータを取り込んで表示する可視化ウィジェット(コンポジット)を実装したいと思います。繰延バインディング/ GIN

実際の可視化部分からデータを取得する方法を分離したいと考えています。だから私はこのようになります一般的なインターフェース「データソース」を追加しました:

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

を、私は私のウィジェットにセッターを追加します。

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; 
     } 
} 

私の具体的なDataSouceは、この抽象クラスを拡張し、インタフェースの取得方法を実装しています。

public class MyDataSource extends HttpDataSource { 

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

これはうまくいきます。 MyDataSourceクラスのインスタンスを作成して、それを私のウィジェットのセッターに渡すことができます。 私はウィジェットを幾分構成可能にしたいと思っています。私はこれがDependency InjectionかDeferred Bindingsのどちらかによって実行できることを知っています。

だから、一つのアプローチは、ウィジェットのユーザーが(それはGWT-ログライブラリーで行われている方法に類似:http://code.google.com/p/gwt-log/source/browse/trunk/Log/src/com/allen_sauer/gwt/log/gwt-log-impl.gwt.xml)モジュールのXMLファイルにデータソースを設定することができるようになり

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

しかし、私はそれが可能かどうかわかりません。なぜなら、MyDataSourceのコンストラクタにURLを渡すことによって、私は状態を持っています。 サイドノート:モジュールのXMLファイルにURLを設定することは可能でしょうか?

私は、私は別のソリューションを使用することになり仮定

(それが延期結合に干渉しない?)も、このウィジェット/ライブラリを使用する人々が自分のデータソースを実装し、ウィジェットに渡すことができた場合に心配しています可視化ウィジェット/ライブラリを使用する親アプリケーションの依存性注入(URLをどのように渡すことができますか?私はおそらく工場を注入する必要がありますか?)

これらの2つのソリューションのどちらが優れていますか?この問題を解決するために遅延バインディングやGINを使用する感覚はありますか?

おかげで事前に

Uemit

答えて

2

あなたはバインディング繰延ない、GINを使用する必要があります。 Deferred bindingはGWTコンパイラが一連のパラメータに基づいてクラスの特定の実装を作成して選択するために使用する技法ですが、本質的に遅延バインドはGoogle Web ToolkitのJavaリフレクションへの回答です。 (Coding Basicsから)シナリオでは、コンパイル時にパラメータのセットに基づいて実装を提供するのではなく、実行時に提供するようにしています。

ここでは、さまざまな方法でGINを使用できます。私はあなたのウィジェットがそのコンストラクタDataSourceインスタンスを介して取ることをお勧めします。それを行う方法については、GinTutorialを参照してください。それは私がいくつかの段落でできるよりもはるかに良い説明をしてくれます。

+0

返信いただきありがとうございますが、この例では延期されたバインディングは実行可能ではありませんか?たとえば、gwt-log(私のメッセージのリンクを参照)は、遅延バインディングを使用してコンパイル時に特定のLogger(ConsoleLogger、FirebugLogger)を設定します。 DataSourceの例でも同じことができますか? –

+0

@ TimeuデータソースにはURLが格納されています。特に同じソースポリシー(http://en.wikipedia.org/wiki/Same_origin_policy)を考慮した場合、URLのようなものはコンパイル時には判別できません。 –

+0

SOPに違反するURLを使用しても、相対URLを使用する場合は、モジュールのxmlファイルでURLを設定することはできません。通常、コンパイル時に、アプリケーションで使用する対応するURLを持つ特定のDataSource実装を知っています。 –

関連する問題