5

この例は、依存性注入に関する本から抜粋したものです。

87ページにこの例があります。

public class NewsletterManager {
  private final List<Recipient> recipients;
  private final DelivererFactory factory; // The book notes this as injected

  public NewsletterManager(List<Recipient> rs, DelivererFactory factory) {
    this.recipients = rs;
    this.factory = factory;
  }

  public void send(Newsletter letter) {
    for (Recipient recipient : recipients) {
      Deliverer d = factory.forLetter(letter);
      d.deliverTo(recipient);
    }
  }

}

Moduleコードの意味は理解していますが、このクラスのインスタンスを作成できるように、をインスタンス化または構成する方法がわかりません。

DelivererFactory注入されているようです。例ではその方法は説明されていませんが、コンストラクターの注入によるものであることを認めましょう。List<Recipient>その場合、必要なインスタンスに固有のインスタンスを渡すにはどうすればよいNewsletterManagerですか?NewsletterManagerGuiceを使用して、モジュール構成DelivererFactoryの特定のインスタンスでインスタンス化するにはどうすればよいList<Recipient>ですか?

私が得られないのは、コンストラクターのシグニチャーに自動的に挿入されたオブジェクトとインスタンス固有のオブジェクトが同時に存在する方法です。NewsletterManagerその場合、自分だけのインスタンスを取得する方法がわかりませんList<Recipient>。工場に頼る必要がありますか?その場合、DelivererFactory私も工場で注入する必要があるので、注入の用途は何ですか...

私の質問が十分に明確であることを願っています...

4

1 に答える 1

10

そうです、この種の注射は工場を使用することによってのみ解決することができます。

実行時にAが注入され、Bが渡される場合は、 Aへの参照を内部的に保持Foo(A a, B b)するファクトリが必要になります。FooFactory.createFoo(B b)

幸い、Guiceには@AssistedInjectionのコンセプトがあります。ファクトリのインターフェイスを提供する必要がありますが、実装の「魔法」はGuiceに任せることができます。

そのかなりよく文書化されています:https ://github.com/google/guice/wiki/AssistedInject

com.google.inject.extensions»guice-based-injectへの追加の依存関係が必要になります

于 2012-07-18T18:52:17.910 に答える