21

newたぶん私は盲目ですが、Guiceを使用して(それから始めて)このメソッドの呼び出しを置き換える方法がわかりません:

public boolean myMethod(String anInputValue) {
    Processor proc = new ProcessorImpl(anInputValue);
    return proc.isEnabled();
}

newテストのために、プロセッサの異なる実装があるかもしれないので、私は呼び出しを避け、その過程で実装への依存を取り除きたいと思います。

私のクラスがProcessorのインスタンスを覚えていれば、コンストラクターを介してそれを注入できますが、Processorsは不変であるように設計されているため、毎回新しいものが必要です。

Guice(2.0)でそれを達成するにはどうすればよいですか?

4

3 に答える 3

27

Guiceを使ってからだいぶ経ちますが、「補助注射」というものを思い出しました。これにより、一部のパラメータが提供され、一部が注入されるファクトリ メソッドを定義できます。Processor を注入する代わりに、anInputValueパラメータを取るファクトリ メソッドを持つプロセッサ ファクトリを注入します。

FactoryProviderのjavadoc を参照してください。私はそれがあなたのために使えるはずだと信じています。

于 2009-06-15T14:13:05.690 に答える
11

「プロバイダー」を注入することで、必要な効果を得ることができます。これは、実行時にプロセッサーを提供するように要求することができます。プロバイダーは、要求されるまでオブジェクトの構築を延期する方法を提供します。

それらは、ここここの Guice ドキュメントで説明されています。

プロバイダーは次のようになります

public class ProcessorProvider implements Provider<Processor> {
    public Processor get() {
        // construct and return a Processor
    }
}

Provider は Guice によって構築および注入されるため、それ自体にビットを注入できます。

コードは次のようになります

@Inject
public MyClass(ProcessorProvider processorProvider) {
    this.processorProvider = processorProvider;
}

public boolean myMethod(String anInputValue) {
    return processorProvider.get().isEnabled(anInputValue);
}
于 2009-06-15T15:43:26.550 に答える
2

プロセッサはanInputValue、そのライフサイクル全体にわたってアクセスする必要がありますか? そうでない場合は、使用しているメソッド呼び出しに次のような値を渡すことができますか。

@Inject
public MyClass(Processor processor) {
    this.processor = processor;
}

public boolean myMethod(String anInputValue) {
    return processor.isEnabled(anInputValue);
}
于 2009-06-15T15:06:38.293 に答える