2

私は思い切って Guice を最新のプロジェクトに使用しました。全体的な印象は良いのですが、なかなか頭に入らない問題にぶつかりました。

背景: これは、ネットワーク経由でコマンドを受け入れ、それらのコマンドを解析し、それらを使用して内部データ構造を変更する Java6 アプリケーションです。当社が製造する一部のハードウェアのシミュレータです。内部データ構造に加えた変更は、コマンドが実際のハードウェアに与える影響と一致するため、データ構造の後続のクエリは、以前に実行されたコマンドに基づいてハードウェアの状態を反映する必要があります。

私が遭遇した問題は、コマンド オブジェクトがこれらの内部データ構造にアクセスする必要があるということです。これらの構造は、エミュレートされるハードウェアの実際のインスタンスによって異なるため、Guice によって作成されています。コマンド オブジェクトは、基本的にダム オブジェクトであるため、Guice によって作成されません。テキスト文字列を受け取り、それを解析し、データ構造のメソッドを呼び出します。

これをすべて機能させる唯一の方法は、これらのコマンド オブジェクトを Guice で作成し、インジェクションを介してデータ構造を渡すことです。それは本当にぎこちなく感じ、データ オブジェクトのコンストラクターを完全に肥大化させます。

ここで何を見逃したのですか?

4

2 に答える 2

1

依存性注入は、ワイヤリング サービスに最適です。値オブジェクトを注入するために使用できますが、特にそれらのオブジェクトが可変である場合、これは少し扱いに​​くい場合があります。

つまり、プロバイダーと@Providesメソッドを使用して、自分で作成したオブジェクトをバインドできます。

于 2009-07-21T06:48:40.843 に答える
0

コマンドへの応答が http 要求への応答とそれほど変わらないと仮定すると、正しい道を進んでいると思います。

http アプリケーションで一般的に使用されるパターンは、アプリケーションのロジックを、リクエストからのパラメーターと注入された一部のバックエンドの両方を持つ存続期間の短いオブジェクトにラップすることです。次に、そのようなオブジェクトをインスタンス化し、すべての魔法を実行する単純なパラメーターなしのメソッドを呼び出します。

たぶん、スコープはあなたに何らかのインスピレーションを与えることができますか? 技術的な詳細については、ドキュメントいくつかのコード例を参照してください。コードでは、それほど似ていないように見えます。これがあなたのケースでどのように機能するかは次のとおりです。

class MyRobot {
   Scope myScope;
   Injector i;       

   public void doCommand(Command c) {
      myScope.seed(Key.get(Command.class), 
      i.getInstance(Handler.class).doSomething();
   }
}


class Handler {
   private final Command c;
   @Inject
   public Handler(Command c, Hardware h) {
     this.c = c;
   }

   public boolean doSomething() {
     h.doCommand(c);
     // or c.modifyState(h) if you want c to access internals of h
   }
}

このソリューションを嫌う人もいますが、少なくとも 2 つの異なるプロジェクトで、過去に Guice に大きく依存しているコードでこれを見たことがあります。

確かに、コンストラクターに値オブジェクトを少し挿入しますが、それらを値オブジェクトとしてではなく、動作を変更するクラスのパラメーターと見なすと、すべて意味があります。

これは少しぎこちなく、値オブジェクトをそのように注入することに眉をひそめる人もいますが、過去に Guice に大きく依存したプロジェクトでこれを見たことがありますが、うまく機能しました。

于 2009-07-21T06:53:28.900 に答える