3

DYNAMIC 依存性注入を実現したい。GUICE はこれをサポートしていますか? そうでない場合、他の DI フレームワークをお勧めできますか?

@Inject を介したインジェクションに使用する必要がある実装は、実行時に、たとえばユーザーとの対話によって決定する必要があります。

これらの質問と同様: http://www.panz.in/2008/12/dynamic-dependency-injection.html http://www.panz.in/2008/12/dynamic-dependency-injection.html

ありがとうございました

4

2 に答える 2

1

実装は入力によって異なる必要があり、ある時点で入力を何らかのクラスに解決する必要があります。

そのマッピングを Guice で実行したい場合は、基本的にパラメーターに基づいた実装を取得します。これは、ここで回答したばかりの SO の質問にマップされます。入力を受け取り、完全に注入された実装を返す小さな注入可能なクラスを作成できます。

すでにそのマッピングがあり、(たとえば) 変数にクラス リテラルがある場合は、直接注入Injectorして実装を要求するだけです。

class YourClass {
  @Inject Injector injector;

  SomeInterface yourMethod(String input) {
    Class<? extends SomeInterface> clazz = getClassLiteralFromInput(input);
    return injector.getInstance(clazz);
  }

  Class<? extends SomeInterface> getClassLiteralFromInput(String input) {
    // Implement this as needed.
    return SomeInstance.class;
  }
}

インジェクターはいつでも注入できますが、必要な実装の種類が本当にわからない場合にのみ行う必要があります (ここのように)。一般に、SomeInstanceそれ自体を注入するかProvider<SomeInstance>、作成を遅らせたい場合は a を注入する必要があります。

于 2013-07-16T17:42:53.977 に答える
0

かつて同様の要件があったため、ファクトリ パターンを使用し、Spring を使用してファクトリ クラスの実装にすべての実装を追加しました。

そうすれば、実行時にどの実装を使用するかがわかると、ファクトリを呼び出して実装クラスを提供します。

また、実装が増えるたびに、ファクトリ クラスのスプリング構成を更新できます。

これは、あなたが考えているデザインに近いものではないかもしれませんが、これで私たちの目的は解決しました。

乾杯 !!

于 2013-07-16T15:48:27.253 に答える