2012-01-04 16 views
2

ウィジェットに依存性注入を使用する方法はありますか?google-ginと一緒にgwt ui-bindingを使用する

public class Foo extends Composite { 

    private final EventBus eventBus; 

    @Inject 
    public Foo(final EventBus eventBus) { 
     this.eventBus = eventBus; 
     // create ui 
    } 
} 

した後、私は、このウィジェットを使用する結合UIを介して定義されているビューを持っている:

は、私は、単純なウィジェット(パッケージcom.example.client.ui.widgetに)を有すると仮定する。例えば:

<ui:UiBinder xmlns:ui='urn:ui:com.google.gwt.uibinder' 
    xmlns:g='urn:import:com.google.gwt.user.client.ui' 
    xmlns:app='urn:import:com.example.client.ui.widget'> 

    <g:HorizontalPanel> 
     <app:Foo/> 
    </g:HorizontalPanel> 
</ui:UiBinder> 

このようにそれを行うことは理由結合UIで使用されているウィジェットの引数なしのコンストラクタの制約のため、動作しません。 GWTコンパイラが@Injectアノテーションがある場合にGINだけを使用すれば良いのではないでしょうか?あるいはこれは他の方法で行うことができますか?たぶん私はGINとGWTのコンセプトを完全に見逃しています。もしそうなら、どんなヒントも大変ありがとうございます。あなたがウィジェットの依存性注入を必要とする場合は、事前に

おかげで、 マルクス

+0

ui-binding自体で宣言されているビューは、gin設定でバインドされていることは明らかです。 – schub

+2

http://code.google.com/p/google-web-toolkit/issues/detail?id=6151 –

答えて

3

あなたが何か間違ったことをやっています。

しかし

あなたのウィジェットの中にいくつかのものの注入のためにGINを使用することが可能です。

次のことについて考えてみましょう: GINはスタンドアロンの依存性注入フレームワークです。必要なものを尋ねるだけで、GINは依存関係が解決されたBeanを作成します。 Ginjectorのインスタンスからオブジェクトが取得された場合にのみ、注入が実行されます。 UIバインダーは、宣言的なUIのフレームワークであり、XMLに基づいてウィジェットを作成します(他にもたくさんありますが、現在は無視できます)。

GINを使用して依存関係をウィジェットに注入する場合、ウィジェットは、UiBinderではなくGINで作成する必要があります。 UiBinderはGINから提供されたインスタントを使用する必要があります。出来ますか? はい、それはによってそれを可能にUiBinderサンプルメッセージ:@UiFactory

を使用してウィジェットフィールド上

または

を注釈@UiField(=真の提供)を使用して

だから、あなたが何をする必要があるかバインディングを作成することですあなたのGinModuleのウィジェットのために、Ginjectorを介してインスタンスを取得するか、ウィジェットのインスタンスを@IiField(provided = true)または@UiFactoryを介してUiBinderに渡すことができます。

+0

こんにちはjusio、 ありがとうございました。 UiFactoryはまさに私が探していたものでした:)ビューは今、プロバイダを注入します。次に、このプロバイダを使用してFooのインスタンスを提供するUiFactoryを持つメソッドに注釈を付けました。しかし、あなたの最初の文章によれば、なぜこの悪いデザインですか?ウィジェットのデカップリングを達成するためには何ができるのでしょうか?しかし、これらのウィジェット内のEventBusはユーザーのやりとりに反応します。 – schub

+0

ウィジェットは通常低レベルの非常に普遍的なものですが、通常はウィジェットを作成するためには、本当に必要なものだけを設定する必要があります。なぜ、ボタンやCellListに依存性注入やEventBusが必要なのか、本当に想像できません。彼らは非常に再利用可能である必要があります。すべての依存関係は、依存関係注入ではなく、Viewなどで管理する必要があります。基本的に依存性注入fwkはすべてのコードで使用するのではなく、いくつかの高レベルの抽象化(ビュー、プレゼンター、サービスなど)のために使用するべきです.PS:それは私の個人的意見です。多くの人が同意しないかもしれません – jusio

+0

私は一般的なウィジェット私の場合は、技術的にウィジェット(Compositeを拡張している)ですが、特定のアプリケーションコンテキスト(コンテキストに依存しないUIコントロールではなく、かなり複雑なウィジェット)内で再利用可能なコンポーネントとして認識されるべきですしかし、あなたが言ったように、議論のおかげで意見が異なるかもしれません:) – schub

関連する問題