3

Composite などの GWT ビューを使用している新しいプロジェクトがあります。

ProductListGinInjector を使用して、メイン メニュー (以下のような) にアイテムを注入しました。これはうまくいきます!

小さなコンポーネントからメイン メニューの項目への参照を更新するためにどこかで参照したいと考えています。私はこの方法でそれを注入しようとします:

public class ProductForm extends Composite {
   ...
   @Inject 
   ProductList list;
   ....

}

しかし、私が を使用すると、list常にnull. これにより、ProductListは次のように定義されます。

public class MyModule extends AbstractGinModule {
   ...
   @Override
   protected void configure() {
      bind(ProductList.class).asEagerSingleton();
      bind(ProductForm.class).asEagerSingleton();
   }
   ...
}

私が間違っていることは何ですか?

解決策: ProductForm が UIBinder の @UIField タグを使用する ProductList の要素であることを言い忘れたため、それを挿入すると、UIBinder を使用して作成されたオブジェクトではなく、新しいオブジェクトが作成されます。

@UIField 属性以外のビュー間の直接参照が不要になるように、プレゼンターとイベント バスを含めるようにコードを再構築する必要がありました。

4

3 に答える 3

4

私はGinのドキュメントに取り組んでいました:ここに引用します:

Gin "Magic" Gin は、インジェクションを簡単にし、コードから定型文を可能な限り削除しようとします。そのために、生成されたコードには、ここで説明されている舞台裏の魔法が含まれています。

Deferred Binding Gin がコードを最適化する 1 つの方法は、GWT の deferred binding を自動化することです。したがって、遅延バインディングを介してバインドされたインターフェイスまたはクラス 1 を注入すると (ただし、Guice/Gin バインディングを介してではなく)、Gin は内部で GWT.create を呼び出し、結果を注入します。一例として、GWT メッセージと定数 (i18n の目的で使用) があります。

public interface MyConstants extends Constants {
  String myWords();
}

public class MyWidget {

  @Inject
  public MyWidget(MyConstants myconstants) {
    // The injected constants object will be fully initialized - 
    // GWT.create has been called on it and no further work is necessary.
  }
}

注: Gin は、シングルトン スコープで GWT.create によって作成されたインスタンスをバインドしません。ただし、遅延バインディング ジェネレーターは通常、生成されたコードにシングルトン パターンを実装するため、不必要なオーバーヘッドが発生することはありません。

次の URL で確認できます: http://code.google.com/p/google-gin/wiki/GinTutorial

遅延バインディングによってシングルトンを自動生成して注入できない理由については言及していません。

これは、コンストラクターで使用して手動で作成することで修正できますGWT.create(YourFactoryInterface.class).getProductList()

これは、目的をテストするために、GWT.create を別のメソッドにプルしてサブクラスでオーバーライドし、それを次のようなテストに使用する必要があることを意味します。

YourFactoryInterface getFactory() {
  return GWT.create(YourFactoryInterface.class)
}

getFactory().getProductList()
于 2011-03-21T09:40:24.240 に答える
1

Gin のasEagerSingleton()バインディングはかなり長い間壊れていて、null を注入していました。修正がいつ行われたかはわかりませんが、v1.0 で熱心なシングルトンに問題がありました。興味がある場合は、問題または説明を参照してください。通常のバインディングに切り替えるか.in(Singleton.class)、Gin 1.5 を使用していることを確認します。

于 2011-03-21T10:22:25.480 に答える
0

Ginjector は ProductForm を作成していますか? 注入された変数を設定するには、おそらくそれが必要だと思います。

于 2011-03-04T09:41:07.453 に答える