2011-09-13 11 views
2

私は誰かがすでにいるかもしれない状況にあります。私は自分のアプリケーションでGWTPを使用しています。 GWTPはクライアントサイドとしてGINを使用しています 依存性注入。また、GWTPはサーバー側に要求を送信するためにDispatcherメカニズムを使用します。GWT - GIN - GWTP - ディスパッチャ注入問題

GWTPによって注入されるいくつかのクラス(PRESENTERS)があります。私は注入なしで実行時に作成されるいくつかの他のクラスを持っています。例をあげましょう:非注入クラスの注入クラスにアクセスする必要があります。私はGWT.Create(Injector.class)メソッドを試していないと思うかもしれません。私はそれを試して、私はそのオブジェクトを非侵害クラスで取得することができますが、オブジェクトDispatcherは、それがベースURLに "/ dispatch /"をインクリメント(追加)する何か異なっています。つまり、私は内部的にGWTPと同じオブジェクトを持つ必要があります。そして、GWTPはエントリポイントにGIN INJECTORを作成します。

解決策の1つは、同じGIN INJECTORをクライアントサイドセッション(静的ハッシュマップ)に入れ、非注入クラスで使用することです(この解決策を試してみて、チャームのように働いています)。

私はより完全な解決策が必要です。

ありがとうございます。

答えて

4

注射は(良い)ウイルスのようなものです。使い始めると、あなたのソースコードに広がります。

あなたが言ったように、キーワード 'new'を使用して作成されたオブジェクトにインスタンスを挿入することはできません。あなたは(GWT.create(MyInjector.class)を通じて)あなたのインジェクターを作成するときのpublic static変数に割り当て、

  • :私は、迅速な汚いと選択肢をお勧めしませんのカップルを考えることができます。 MyInjectorにはgetDispatcher()メソッドがあり、Dispatcherを返します。これは本当に汚れた選択肢ですが、私はそれを使用するすべてのコンポーネントがテストするのが非常に難しいので、私はそれをお勧めしません。
  • Bのインスタンスを作成するのは誰ですか?インジェクションを使用して作成されたオブジェクトが見つかるまで、階層をたどり、Dispatcherを注入して、Bの作成者まですべて渡します。

あなたのデザインを確認することをお勧めします。通常、すべてのクラスにビジネスロジックを注入する必要があります。 Dispatcherを渡している場合、Bはビジネスロジックを実行すると思われるので、に注入する必要があります。

+0

@ Luishmahou:あなたに同意します。私は両方の方法を試しました。そして両方とも彼らの所で働いた。しかし、ディスパッチャーを階層のレベルに渡すことは私にとってはるかに難しい作業になるので、私は最初の選択肢が自分の状況に適していると思います。だから私は、静的なハッシュマップとしてクライアント側のセッションを作成し、そのハッシュマップにMyInjectorを作成して、今すぐ私はそれが欲しいと同じインスタンスを取得することができます。しかし、それを行う正しい方法ですか? –

+0

解決策は私の答えの最後の段落にあります。あなたはクラスをリファクタリングする必要があるので、注入することができます。 私はGINを使い始めたときも同じ問題がありました。また、インジェクタを保持し、ディスパッチャや他のアプリケーションと同様の共通インスタンスを渡すために静的変数を使用しました。しかし、コンポーネントをテストするのが難しくなります。少しずつ私は私のプロジェクトをリファクタリングしました。今はすべてが注入されテスト可能です。 – Luismahou

+0

私は同じことをやってみましょう....ありがとうございました。 –