Ich habe dagger2-Abhängigkeiten in meiner App so eingerichtet, wie ich es verstehe und durch die vielen Beispiele. Was ich nicht gefunden habe, ist der richtige Weg, alle Abhängigkeiten zu nutzen, sobald sie injiziert sind.Dagger2 Verwenden eines vollständigen Abhängigkeitsgraphen
Jedes der Singletons im Modul ist abhängig von der Ausgabe des Singletons davor. Wie wird das gesamte Abhängigkeitsdiagramm verwendet, ohne nacheinander alle Singletons aufzurufen, um die erforderlichen Eingaben zu erhalten?
Angesichts der folgenden:
AppComponent
@Singleton
@Component(modules = {
DownloaderModule.class
})
public interface AppComponent {
void inject(MyGameActivity activity);
}
DownloaderModule
@Module
public class DownloaderModule {
public static final String NETWORK_CACHE = "game_cache";
private static final int GLOBAL_TIMEOUT = 30; // seconds
public DownloaderModule(@NonNull String endpoint) {
this(HttpUrl.parse(endpoint));
}
@Provides @NonNull @Singleton
public HttpUrl getEndpoint() {
return this.endpoint;
}
@Provides @NonNull @Singleton @Named(NETWORK_CACHE)
public File getCacheDirectory(@NonNull Context context) {
return context.getDir(NETWORK_CACHE, Context.MODE_PRIVATE);
}
@Provides @NonNull @Singleton
public Cache getNetworkCache(@NonNull @Named(NETWORK_CACHE) File cacheDir) {
int cacheSize = 20 * 1024 * 1024; // 20 MiB
return new Cache(cacheDir, cacheSize);
}
@Provides @NonNull @Singleton
public OkHttpClient getHttpClient(@NonNull Cache cache) {
return new OkHttpClient.Builder()
.cache(cache)
.connectTimeout(GLOBAL_TIMEOUT, TimeUnit.SECONDS)
.readTimeout(GLOBAL_TIMEOUT, TimeUnit.SECONDS)
.writeTimeout(GLOBAL_TIMEOUT, TimeUnit.SECONDS)
.build();
}
MyGameApp
public class MyGameApp extends Application {
private AppComponent component;
private static Context context;
public static MyGameApp get(@NonNull Context context) {
return (MyGameApp) context.getApplicationContext();
}
@Override
public void onCreate() {
super.onCreate();
component = buildComponent();
MyGameApp.context = getApplicationContext();
}
public AppComponent component() {
return component;
}
protected AppComponent buildComponent() {
return DaggerAppComponent.builder()
.downloaderModule(new DownloaderModule("https://bogus.com/"))
.build();
}
}
Wie meinst du, "hängt von der Ausgabe des Singleton davor ab?" Es sieht so aus, als ob Ihr Modul gut strukturiert ist, um jedes Stück, das es benötigt, zu injizieren, indem jedes Stück als ein Eingabeparameter in der entsprechenden "@ Provide" -Methode genommen wird. Sie sollten in der Lage sein, 'OkHttpClient' oder eines der anderen Abhängigkeiten, die Sie erstellt haben, in Ihre MyGameActivity zu injizieren. –
Ich habe einfach Schwierigkeiten, es direkt in meinem Kopf zu bekommen. Ich lese noch mehr und die Konzepte sinken. Was frustrierend ist, gibt es Tonnen von Artikeln, die zeigen, wie man es aufstellt, aber tatsächliche Anwendungsbeispiele sind schwer zu finden. Ich arbeite jetzt mit einem anständigen Beispiel. Vielen Dank. –