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

조회수 1411회

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

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

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

  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

  • 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) 에러가 에상이 되어서요. 제가 잘못 이해하고 있는지 조언을 부탁드리겠습니다. - 감사합니다. 알 수 없는 사용자 2016.5.13 12:09

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)