tag studio log example and android dagger-2

log - tag android studio



Daga 2 inyectando los parĂ¡metros del constructor. (2)

Vi 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(???); } }

el constructor Thermosiphon todavía requiere un Heater como argumento, lo que hace que toda la ''inyección automática de dependencias del constructor'' sea inútil.

Lo intenté

return new Thermosiphon(null);

y

return new Thermosiphon();

(constructor vacío) y esperaba que Dagger2 detectara que quería que se inyectara el Heater faltante, sin embargo, el Calentador del Thermosiphon provisto siempre es nulo;

HeaterComponent aunque mi HeaterComponent / HeaterModule funciona bien y puede proporcionar un Heater .

¿Completamente malentiendo la característica completa de ''Dagger satisface las dependencias de los constructores para usted'' o me estoy perdiendo algo?


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

Si desea usar un método @Provides , y para responder a su pregunta por completo, 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); } }


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

@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; } }

Pero con la inyección del constructor, también podrá proporcionar objetos de ese ámbito dado u objetos sin ámbito, siempre que 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() { } }