0

答えを見つけようとして大量のstackoverflowやその他のリソースを読みましたが、おそらくそれがわかりません。

アプリケーションのクライアント コードのいくつかのウィジェットとクラスに GIN @Singleton を挿入しようとしています。Spring を使用すると、正しいアノテーションを使用するだけで、ほぼどこにでも何でも注入できます。GWT と GIN を使用すると、コンストラクター以外の場所に注入できないようです。私は非常に大規模なプロジェクトに取り組んでおり、ほとんど不可能であるため、コンストラクターに注入したくありません。

これらのクラスには、ウィジェットとそうでないものがあります。それらはアプリケーション全体で使用され、注入されるものもあれば、new によってインスタンス化されるものもあれば、両方を持つものもあるため、コンストラクターの変更はさらに困難になります。

コードを次のように動作させたいのですが、GIN でどのように動作するかわかりません。

@Singleton
public class ApplicationData {

   public AppInfo getAppInfo() {
      return new AppInfo("My App Info");
   }
}

public class MyClass{
   @Inject protected ApplicationData applicationData;

   public void someMethod() {
      doSomething(applicationData.getAppInfo());
   }
}

他の誰かがこれをプレゼンターで動作するようにコーディングしました。なぜそれが動作するのかはある程度理解していますが、概念を完全には理解していません。彼らはもはや尋ねることはありません。

これが機能するように私が持っているハックですが、私はそれが好きではありません:

@GinModules(GinModule.class)
public interface Injector extends Ginjector {
   final Injector INSTANCE = GWT.create(Injector.class);

   ApplicationData getApplicationData();
}

public class MyWidget extends Composite implements TakesValue<Integer>{

   public static interface MyWidgetUiBinder extends UiBinder<FormPanel, MyWidget>}

   private MyWidgetUiBinder uiBinder = GWT.create(MyWidgetUiBinder.class);
   private ApplicationData appData;

   public ArrivalTimeWidget() {
      appData = Injector.INSTANCE.getApplicationData();
      initWidget(uiBinder.createAndBindUi(this));
      someMethod(appData.getAppInfo());
   }
}

ハックを使用する代わりに、これを正しく行うのを手伝ってください。そして、これに関しては、私はばかなので、完全な説明を付けて、私をばかのように扱ってください。

4

1 に答える 1

0

答えは、@Thomas Broyer が言ったように、自分自身が注入されたオブジェクトからのみ注入できるということです。私は「新しい」オブジェクトを作成し、それらを注入していませんでした。

于 2013-09-19T17:37:30.017 に答える