我已经在我的应用程序中设置了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();
}
}
你是什么意思,“取决于它之前的单身人士的产出”?看起来你的模块结构良好,可以通过在相应的'@ Provide'方法中将每个部分作为输入参数来注入它需要的每个部分。你应该能够注入'OkHttpClient'或者你从MyGameActivity中创建的任何其他依赖。 –
我只是无法在脑海中找到它。我读了更多,概念正在沉入其中。令人沮丧的是有大量文章显示如何设置它,但实际使用示例很难找到。现在我正在用一个体面的例子。谢谢。 –