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:
- Dagger v2: Inyectar 2 ámbitos diferentes en un objeto
- Dagger 2 "Dagger" prefijo componente no es capaz de compilar? Clase generada automáticamente
- Dagger 2, a veces en la compilación me sale "no se puede encontrar la clase de símbolo DaggerApplicationComponent"
- Cómo usar daga en un proyecto de biblioteca de Android
- ¿Es posible a los miembros de @Inject (proporcionados a través de @Provides), que contienen un Contexto de Actividad de la Actividad Base
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?
- No se puede encontrar la clase de símbolo "Generated" para Dagger 2
- Cómo inyectar una actividad en un adaptador usando dagger2
- Dagger: la clase no podría estar enlazada con la clave
- Dagger 2: Inyectar el parámetro introducido por el usuario en el objeto
- Alcance de la actividad Dagger2, ¿cuántos módulos / componentes necesito?
- Dagger2: Error cuando dos componentes tienen la misma firma de método de inyección
- Inyecciones anidadas / recursivas con Dagger
- Qué es exactamente la daga y cómo funciona
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); } }
- Android Viewpager que guarda datos y vistas
- Archivo APK de Android y archivos DEX no creados, sin advertencia ni error