dagger2 + retrofit에서 서로다른 api를 가지고 있을 수 있을까요?


안녕하세요. 궁금한 사항이 있는데 혹시 알고 있으시면 조언을 구하고자 합니다.

https://github.com/phajduk/dagger2-example 이 예제를 참고하고 있는데 Github API뿐만 아니라 한 엑티비티 안에서 예를들어 openwheatheAPI를 같이 사용하고자 합니다.

근데 어려운 부분이 DebugApiModule를 보면 provideEndpoint, provideGitHubService부분을 분리 해야 될거 같은데 해결을 하지 못해 조언을 구하고자 합니다.

  • 2016년 05월 12일에 작성됨

조회수 227


1 답변


좋아요
2
싫어요
채택취소하기

Github / Weather API의 Endpoint가 다른 경우 RestAdapter 및 Endpoint를 각각 제공해야 됩니다. GitHubServce.java, MockGitHubService.java를 참고하셔서 WeatherService.java, MockWeatherService.java 클래스를 만드시고요.

DebugApiModule에서는 아래 코드를 참고하셔서 WeatherService에 대한 코드를 한벌씩 만들어주시면 됩니다. 그리고 Endpoint 객체를 제공하는 provideXXXEndpoint는 Qualifier annotation을 사용하셔서 실제 객체 주입 시 어떤 객체를 사용할 것인지 명시해야 합니다. Qualifier annotation는 Dagger1의 문서 혹은 Dagger2 테스트 코드를 참고하세요.

@Module(includes = ApiModule.class)
public class DebugApiModule {
    @Provides
    @Singleton
    @GitHubEndPoint
    Endpoint provideGitHubEndpoint() {
        return Endpoints.newFixedEndpoint(ApiModule.PRODUCTION_GITHUB_API_URL);
    }

    @Provides
    @Singleton
    @WeatherEndPoint
    Endpoint provideWeatherEndpoint() {
        return Endpoints.newFixedEndpoint(ApiModule.PRODUCTION_WEATHER_API_URL);
    }

    @Provides
    @Singleton
    GitHubService provideGitHubService(RestAdapter restAdapter, MockRestAdapter mockRestAdapter, MockGitHubService mockService,
                                       @UseMockBackend BooleanPreference useMockMode) {
        if(useMockMode.get()) {
            return mockRestAdapter.create(GitHubService.class, mockService);
        } else {
            return restAdapter.create(GitHubService.class);
        }
    }

    @Provides
    @Singleton
    WeatherService provideWeatherService(RestAdapter restAdapter, MockRestAdapter mockRestAdapter, MockWeatherService mockService,
                                       @UseMockBackend BooleanPreference useMockMode) {
        if(useMockMode.get()) {
            return mockRestAdapter.create(WeatherService.class, mockService);
        } else {
            return restAdapter.create(WeatherService.class);
        }
    }

    @Provides
    @Singleton
    MockRestAdapter provideMockRestAdapter(RestAdapter restAdapter) {
        MockRestAdapter mockRestAdapter = MockRestAdapter.from(restAdapter);
        return mockRestAdapter;
    }
}

  • 너무나 좋은 답변을 해주셔서 감사합니다. 조금 더 궁금한 부분이 Qualifier annotation를 사용해서 객체를 선택 할 수 있을거 같은데 저에 경우에는 2개다 동시에 올려 놓으려고 합니다. Github,openWehere 문제가 없을까요? multiple(retrofit) 에러가 에상이 되어서요. 제가 잘못 이해하고 있는지 조언을 부탁드리겠습니다. - 감사합니다.    hubert   2016.5.13 12:09     

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close