1

ドキュメントでは、 @Provides メソッドには、次のような独自の依存関係がある可能性があると書かれています。

@Provides Pump providePump(Thermosiphon pump) {
  return pump;
}

次のように書くと何が変わるでしょうか。

@Provides Pump providePump() {
  return new Thermosiphon();
}

そして、最初の抜粋: メソッドはどこからポンプを取得しますか?

4

3 に答える 3

2

ドキュメントには、次のThermosiphonクラスも示されています。

class Thermosiphon implements Pump {
  private final Heater heater;

  @Inject
  Thermosiphon(Heater heater) {
    this.heater = heater;
  }

  ...
}

このクラスのコンストラクターには、注釈が付けられてい@Injectます。これにより、Dagger は必要なときにいつでもこのコンストラクターを使用することを認識し、インスタンスをThermosiphon自動的に提供するHeaterため、その必要はありません。

自分で新しいThermospihonインスタンスを作成するのはまったく問題ありませんが、Dagger はこのようにすることで手間を省きます。たとえば、Heater手動で行う場合、どこかから参照を取得する必要があります。それが Dagger のすべてなので、退屈な反復作業を行う必要はありません。

于 2015-04-09T20:52:27.683 に答える
2

これらは事実上、インスタンスを要求するたびに Thermosiphon.class の新しいインスタンスが作成される場合と同じです。それがシングルトンの場合 (または何らかの方法でスコープが設定されている場合)、違いがあります。

次の場合、最初の例はシングルトンのエイリアスです。ただし、2 番目の例では、毎回新しいインスタンスが作成されます。

@Provides
@Singleton
Thermosiphon provideThermosiphon() {
  return new Thermosiphon();
}



個人的には、最初のアプローチの方が好きです。最初の方法を使用すると、プロバイダーを後で追加または変更し、エイリアスに渡す前にインスタンスのスコープまたは状態を調整できます。少し柔軟になったようです。

于 2015-04-09T20:52:39.277 に答える
0

モジュールで宣言された他の Bean を探します

例えば:

@Module
public class MainModule {


    @Provides
    public EmailServiceApiGateway provideEmailServiceApiGateway() {
        return new EmailServiceApiGateway();
    }

    @Provides
    public EmailSendingActivityPresenter provideEmailSendingActivityPresenter(EmailServiceApiGateway emailServiceApiGateway) {
        return new EmailSendingActivityPresenterImpl(emailServiceApiGateway);
    }
}

したがって、上記の場合、EmailServiceApiGateway は EmailSendingActivityPresenter に自動的に挿入されます。

于 2015-04-09T20:54:03.943 に答える