【发布时间】:2016-09-16 08:22:53
【问题描述】:
我正在用 Dagger2 尝试一些东西,但仍然难以理解..
我想在 2 个类中使用 2 个服务,SplashActivity 和 HomeActivity。 服务依赖于 NetModule,因为我想重用改造和 okhttpclient 提供。
这是我的网络模块:
@Module
public class NetModule {
@Provides
Retrofit provideRetrofit(@Named("BaseUrl") String baseUrl, OkHttpClient okHttpClient) {
return new Retrofit.Builder()
.baseUrl(baseUrl)
.client(okHttpClient)
.addConverterFactory(GsonConverterFactory.create())
.build();
}
@Provides
HttpLoggingInterceptor provideHttpLoggingInterceptor() {
HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
if (BuildConfig.DEBUG) {
logging.setLevel(HttpLoggingInterceptor.Level.HEADERS);
} else {
logging.setLevel(HttpLoggingInterceptor.Level.NONE);
}
return logging;
}
@Provides
OkHttpClient provideOkHttpClient(HttpLoggingInterceptor httpLoggingInterceptor, @Named("ConnectTimeoutMs") int connectTimeoutMs, @Named("ReadTimeoutMs") int readTimeoutMs) {
return new OkHttpClient.Builder()
.addInterceptor(httpLoggingInterceptor)
.connectTimeout(connectTimeoutMs, TimeUnit.MILLISECONDS)
.readTimeout(readTimeoutMs, TimeUnit.MILLISECONDS)
.build();
}
}
StaticDataModule 和 StatusModule,这是两个不同的 API,所以他们使用 NetModule:
@Module(includes = NetModule.class)
public class StaticDataModule {
@Provides
@Singleton
StaticDataService provideStaticDataService(Retrofit retrofit) {
return new RetrofitStaticDataService(retrofit);
}
@Provides
@Named("BaseUrl")
String provideBaseUrl() {
return "http://url_static.com";
}
@Provides
@Named("ConnectTimeoutMs")
int provideConnectTimeoutMs() {
return 5000;
}
@Provides
@Named("ReadTimeoutMs")
int provideReadTimeoutMs() {
return 5000;
}
}
@Module(includes = NetModule.class)
public class StatusModule {
@Provides
@Singleton
StatusService provideStatusService(Retrofit retrofit) {
return new RetrofitStatusService(retrofit);
}
@Provides
@Named("BaseUrl")
String provideBaseUrl() {
return "http://url_status.com";
}
@Provides
@Named("ConnectTimeoutMs")
int provideConnectTimeoutMs() {
return 5000;
}
@Provides
@Named("ReadTimeoutMs")
int provideReadTimeoutMs() {
return 5000;
}
}
我在这个组件中构建它们:
@Singleton
@Component(modules = {AppModule.class, StaticDataModule.class, StatusModule.class})
public interface AppComponent {
void inject(SplashActivity splashActivity);
void inject(HomeActivity homeActivity);
}
我收到此错误:@javax.inject.Named("BaseUrl") java.lang.String 被绑定多次。 我理解我的错误,dagger 不知道 StaticData baseUrl 和 Status baseUrl 之间是谁提供的。
我尝试制作 2 个组件,StaticDataComponent 和 StatusComponent,但我无法在同一个 Activity 中同时注入这两个组件。
我尝试在 StaticDataModule 和 StatusModule 中扩展 NetModule,并使用构造函数提供参数,但在改造提供时出现多个边界错误。
所以我不知道如何在 2 个模块中重用具有不同参数的 NetModule,如果有人有示例,它应该对我有帮助。
谢谢!
【问题讨论】:
-
最简单的事情,你可以做:将名称更改为 StatusBaseUrl 和 StaticBaseUrl
-
但是在 NetModule for baseUrl 我需要什么?我必须写 @Named("Something") 不?
-
或者不,使用相同的名称,但不要将 NetModule 作为依赖项。用于一个组件(NetModule + 状态模块),用于第二个组件(NetModule + 静态模块)
-
是的,这可以创建 2 个服务,但问题是注入。如果我让 NetModule+StatusModule 注入 MainActivity 和 NetModule+StaticModule 注入 MainActivity 它不起作用,2个组件不能注入同一个类..那是我的问题=(或者组件有办法注入父级?
-
当你遇到这种情况时,这意味着你最好重新设计你的架构:) 解决方案可以是,你不要像往常一样注入,而是作为方法提供