Dagger 2注入构造函数的参数

asc*_*sco 34 android dagger-2

我在Dagger 2网站上看到了以下示例:

class Thermosiphon implements Pump {
  private final Heater heater;

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

  ...
}
Run Code Online (Sandbox Code Playgroud)

和文件:

当请求新实例时,Dagger将获取所需的参数值并调用此构造函数.

当我写一个模块来提供Thermosiphon类似的

@Module
public class ThermosiphonModule {

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

}
Run Code Online (Sandbox Code Playgroud)

Thermosiphon构造仍然需要Heater作为一个参数,渲染无用整个"的构造的依赖关系自动注射".

我试过了

return new Thermosiphon(null); 
Run Code Online (Sandbox Code Playgroud)

return new Thermosiphon(); 
Run Code Online (Sandbox Code Playgroud)

(空构造函数)并希望Dagger2拿起我希望Heater注入的缺失,但所提供的加热器Thermosiphon总是为空;

我验证虽然我的HeaterComponent/ HeaterModule工作正常,并能提供Heater.

我是否完全误解了'Dagger满足你的构造函数依赖关系'的整个特征,还是我错过了什么?

Epi*_*rce 55

如果您正在使用模块,那么如果您有两个提供程序模块绑定到同一组件,那么您将能够允许它们将加热器视为构造函数参数.

@Module
public class HeaterModule {
    @Provides
    @Singleton
    Heater heater() {
        return new Heater(); // if not using @Inject constructor
    }
}

@Module
public class ThermosiphonModule {
    @Provides
    @Singleton
    Thermosiphon thermosiphon(Heater heater) {
        return new Thermosiphon(heater); // if not using @Inject constructor
    }
}

@Singleton
@Component(modules={ThermosiphonModule.class, HeaterModule.class})
public interface SingletonComponent {
    Thermosiphon thermosiphon();
    Heater heater();

    void inject(Something something);
}

public class CustomApplication extends Application {
    private SingletonComponent singletonComponent;

    @Override
    public void onCreate() {
        super.onCreate();
        this.singletonComponent = DaggerSingletonComponent.builder().build(); //.create();
    }

    public SingletonComponent getSingletonComponent() {
        return singletonComponent;
    }
}
Run Code Online (Sandbox Code Playgroud)

但是使用构造函数注入,只要它们具有构造函数,您还可以提供给定范围的对象或未编组的对象@Inject.

例如,

@Singleton
@Component // no modules
public interface SingletonComponent {
    Thermosiphon thermosiphon();
    Heater heater();

    void inject(Something something);
}
Run Code Online (Sandbox Code Playgroud)

@Singleton
public class Heater {
    @Inject
    public Heater() {
    }
}
Run Code Online (Sandbox Code Playgroud)

@Singleton
public class Thermosiphon {
    private Heater heater;

    @Inject
    public Thermosiphon(Heater heater) {
        this.heater = heater;
    }
}
Run Code Online (Sandbox Code Playgroud)

要么

@Singleton
public class Thermosiphon {
    @Inject
    Heater heater;

    @Inject
    public Thermosiphon() {
    }
}
Run Code Online (Sandbox Code Playgroud)


nha*_*man 29

首先,由于您已经注释了Thermosiphonwith 的构造函数@Inject,因此您不需要@Provides方法.Dagger使用此构造函数在需要时创建实例.只需注释Thermosiphon类本身就@Singleton可以保留单例行为.

如果您确实想使用@Provides方法并完全回答您的问题,可以指定Heater方法的参数:

@Module
public class ThermosiphonModule {

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

}
Run Code Online (Sandbox Code Playgroud)