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() {
}
}