我正在使用Dagger2尝试一些操作,但仍然很难理解。

我想在2个类SplashActivity和HomeActivity中使用2个服务。
服务取决于NetModule,因为我想重用改造和okhttpclient提供的内容。

这是我的NetModule:

@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被绑定多次。
我了解我的错误,匕首不知道谁在StaticData baseUrl和Status baseUrl之间提供谁。

我试图制作2个组件,StaticDataComponent和StatusComponent,但是我不能在同一 Activity 中同时注入这两个组件。

我试图在StaticDataModule和StatusModule中扩展NetModule,并使用构造函数提供参数,但在翻新提供时出现了多个界限错误。

所以我不知道如何在2个模块中重用具有不同参数的NetModule,如果有人举一个例子,它应该对我有帮助。

谢谢 !

最佳答案

不要将NetModule.class作为模块的依赖项包括在内,而应将它们分别包含在组件中。

@Module(includes = NetModule.class)
public class StaticDataModule {


@Module
public class StaticDataModule {

然后像这样使用:
@Component(modules = {
    NetModule.class, StaticDataModule.class
}) public interface FirstComponent {
  void inject(WhateverYouWantActivity activity);
}

@Component(modules = {
    NetModule.class, StatusModule.class
}) public interface FirstComponent {
  void inject(WhateverYouWantSecondActivity activity);
}

如果必须注入相同的 Activity ,则最好重新设计架构,但是如果仍然要这样做,则可以摆脱注入方法,并添加如下内容:
@Component(modules = { /* your modules */ }) public interface YourComponent {

  Retrofit getRetrofit();

  OkHttpClient getOkHttpClient();
}

并相应地使用它:
retrofit = yourComponentBuiltByDagger.getRetrofit();

代替:
@Inject Retrofit retrofit;

08-17 16:21