Próbuję użyć Dagger do wykonania iniekcji Dependency w aplikacji, którą buduję, i napotkam problem z konstruowaniem odpowiednich DAG-ów, gdy mam moduł jednego pakietu w zależności od wartości dostarczonych przez wtryskiwacz (prawdopodobnie dostarczone przez inny moduł).Moduł w zależności od innego modułu w Sztyletie
Jeśli mam prosty moduł dla niektórych zmiennych konfigurowalne (które mogłyby chcę zamienić się w środowiskach testowych, na przykład)
@Module(
injects = DependentModule.class,
)
public class ConfigModule {
@Provides @Named("ConfigOption") String provideConfigOption() {
return "This Module's configurable option!";
}
}
i inny moduł zależy od niego, na przykład
@Module(
injects = {
TopLevelClass.class
}
)
public class DependentModule {
@Inject @Named("ConfigOption") String configOption;
public DependentModule() {
ObjectGraph.create(this).inject(this);
doSomethingWithConfig(configOption);
}
@Provides @Singleton UsefulValue provideUsefulValue() {
// Whatever this module needs to do...
}
}
Linia gdzie staram się bootstrap zastrzyk w konstruktor nie powiedzie się, a ona twierdzi, że nie określono wyraźne injects
linię w odpowiednim module.
metodą prób i błędów widzę ten znika, gdy w @Module
dodać linię include = ConfigModule.class
, ale wydaje mi się semantycznie niewłaściwy, ponieważ a) DAG będę tworzyć będzie teraz zawierać wartości obu modułów , a nie tylko jeden, oraz b) pokonuje cel/elastyczność DI przede wszystkim w celu połączenia konkretnego Modułu, zamiast po prostu pozwolić Daggerowi wprowadzić odpowiednią wartość.
Przypuszczam, że nie powinienem tworzyć wykresu obiektowego z this
tylko po to, aby go wstrzyknąć? Ale potem napotkasz emisję nie powiązanie określonego modułu ...
zwięźle:
- Co to jest „właściwy” sposób, aby wstrzyknąć wartości do jednego modułów, które mogą być dostarczane z innymi modułami? Tutaj używam wtrysku polowego, ale moje eksperymenty z wtryskiem konstruktora również zaowocowały wieloma niepowodzeniami.
- Zależnie od tego, kiedy należy użyć
addsTo
vs.includes
?
Dzięki :)
Hej, dziękuję bardzo za to. Przepraszam za późne zatwierdzenie, musiałem zgasić kilka innych pożarów. Nie jestem pewien, czy jestem w 100% zrozumiały co do wszystkiego, ale użycie "Injectable" zapewnia metody (o których nie wiedziałem, że potrafisz!). –