Dagger 2 inyectar parámetros del constructor

He visto el siguiente ejemplo en el sitio web de Dagger 2 :

class Thermosiphon implements Pump { private final Heater heater; @Inject Thermosiphon(Heater heater) { this.heater = heater; } ... } 

Y la documentación:

Cuando se solicita una nueva instancia, Dagger obtendrá los valores de los parámetros requeridos e invocará este constructor.

Cuando escribo un módulo para proporcionar un Thermosiphon como

 @Module public class ThermosiphonModule { @Provides @Singleton Thermosiphon provideThermosiphon() { return new Thermosiphon(???); } } 

Thermosiphon constructor de Thermosiphon todavía requiere un Heater como argumento, haciendo inútil toda la "inyección automática de dependencias del constructor".

Lo intenté

 return new Thermosiphon(null); 

y

 return new Thermosiphon(); 

(Constructor vacío) y esperaba que Dagger2 captara que quería que el Heater faltante fuera inyectado, sin embargo el Calentador del Thermosiphon provisto siempre es nulo;

He comprobado que mi HeaterComponent / HeaterModule están funcionando bien y son capaces de proporcionar un Heater .

¿No entiendo completamente la característica completa de 'Dagger satisface las dependencias del constructor para usted' o me estoy perdiendo algo?

Si está usando módulos, entonces si tiene los dos módulos de proveedor enlazados al mismo componente, entonces podrá permitirles ver el calentador como un parámetro de constructor.

 @Module public class HeaterModule { @Provides @Singleton Heater heater() { return new Heater(); } } @Module public class ThermosiphonModule { @Provides @Singleton Thermosiphon thermosiphon(Heater heater) { return new Thermosiphon(heater); } } @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; } } 

Sin embargo, con la inyección de constructor, también puede proporcionar objetos de ese alcance dado o objetos no codificados, siempre y cuando tengan un constructor @Inject .

Por ejemplo,

 @Singleton @Component // no modules public interface SingletonComponent { Thermosiphon thermosiphon(); Heater heater(); void inject(Something something); } 

Y

 @Singleton public class Heater { @Inject public Heater() { } } 

Y

 @Singleton public class Thermosiphon { private Heater heater; @Inject public Thermosiphon(Heater heater) { this.heater = heater; } } 

O

 @Singleton public class Thermosiphon { @Inject Heater heater; @Inject public Thermosiphon() { } } 

Por Thermosiphon , ya que has anotado el constructor de Thermosiphon con @Inject , no necesitas un método @Provides . Dagger utiliza este constructor para crear una instancia cuando sea necesario. Simplemente anote la clase Thermosiphon con @Singleton para preservar el comportamiento singleton.

Si desea utilizar un método @Provides y para responder a su pregunta completamente, puede especificar el Heater como un parámetro para el método:

 @Module public class ThermosiphonModule { @Provides @Singleton Thermosiphon provideThermosiphon(Heater heater) { return new Thermosiphon(heater); } } 
  • Dagger ejemplo construido a través de eclipse falla con 'Asegúrese de que la generación de código se ejecutó para este módulo.'
  • ¿Cómo anula un módulo / dependencia en una prueba de unidad con Dagger 2.0?
  • No se puede proporcionar sin un constructor @Inject o de un método @ Proporcionado-anotado
  • Ciclo de inclusión del módulo Dagger
  • Dagger 2.2 método del módulo de constructor de componentes obsoleto
  • Dagger 2 inyecta error en AppCompatActivity
  • Dagger 2: Proporcionar la misma instancia entre múltiples componentes con el mismo alcance en diferentes módulos de biblioteca
  • Android Espresso con Dagger
  • Dagger2 Component (un-scoped) no puede depender de los componentes del ámbito - Error
  • ¿Cuándo usar Dagger en la aplicación Android?
  • Dagger2 componente genérico método de inyección
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.