提供方法依赖性

时间:2015-04-09 20:42:41

标签: android dagger dagger-2

在文档中,它说@Provides方法可能依赖于它们,例如:

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

如果我这样写的话会有什么变化:

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

在第一个剪辑中:该方法从何处获取泵?

3 个答案:

答案 0 :(得分: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的意义所在,所以你不必做冗长乏味的重复工作。

答案 1 :(得分:2)

这些实际上是相同的 IF 每次请求实例时都会创建一个新的Thermosiphon.class实例。如果它是单身(或任何方式),那么我们就会有所不同。

如果您有以下内容,那么第一个示例是单例的别名。但是,第二个示例仍然会每次创建新实例。

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



就个人而言,我更喜欢第一种方法。使用第一种方法,您可以稍后添加或更改提供程序,并在将实例传递给别名之前调整实例的范围或状态。它看起来有点灵活。

答案 2 :(得分: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。