私はそれを理解している多くの例を通して、私のアプリケーションにdagger2依存関係を設定しました。私が見つけていないのは、一度注入されるとすべての依存関係を使う正しい方法です。Dagger2依存グラフ全体を使用する
モジュール内の各シングルトンは、その前のシングルトンの出力に依存します。必要な入力を得るために各シングルトンを順番に呼び出すことなく、依存グラフ全体をどのように使用しますか?
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();
}
}
"それ以前にシングルトンの出力に依存する"ということをどうやって意味していますか?あなたのモジュールは、各ピースを対応する '@ Provides'メソッドの入力パラメータとして取ることによって、必要な各ピースを注入するように適切に構成されているようです。あなたはMyGameActivityの中で作成した 'OkHttpClient'やその他の依存関係を注入することができます。 –
私は単純に頭がおかしくなっていません。私はもう少し読んで、コンセプトは沈んでいます。不満は、セットアップ方法を示す記事がたくさんありますが、実際の使用例は見つけるのが難しいです。私はまともな例で今働いています。ありがとう。 –