Как прочитать имя хоста из метаданных при предоставлении модификации в модулях DI? - PullRequest
0 голосов
/ 08 ноября 2018

Я использую Dagger 2 + Retrofit для реализации моих интерфейсов, которые отправляют / получают данные в / из моего веб-сервиса

Я имею в виду AppModule.java Филиппа BOISNEY , как показано ниже

private static String BASE_URL = "https://api.github.com/";

@Provides
Gson provideGson() { return new GsonBuilder().create(); }

@Provides
Retrofit provideRetrofit(Gson gson) {
    Retrofit retrofit = new Retrofit.Builder()
            .addConverterFactory(GsonConverterFactory.create(gson))
            .baseUrl(BASE_URL)
            .build();
    return retrofit;
}

Однако у меня есть вопрос, что если у меня есть несколько хостов моих веб-сервисов, таких как Production , Staging и Development ?

Я уже настроил эти разные хосты, подключенные к Build Config, в моем AndroidManifest.xml, но я не представляю, как читать метаданные в AppModule, чтобы заменить BASE_URL соответствующей конфигурацией сборки

Пожалуйста, дайте мне совет, спасибо

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

Я прекращаю чтение соответствующего хоста из метаданных в AndroidManefist, вместо этого я переключаюсь на другой подход, ссылаясь на предложение @ ConstOrVar

Вот мой app / build.gradle, у меня есть 2 варианта, которые описывают мой промежуточный и производственный хост соответственно

productFlavors {
    production {
        buildConfigField("String", "SERVER_HOST", "\"myproductionost.com\"")
    }
    staging {
        buildConfigField("String", "SERVER_HOST", "\"mystaginghost.com\"")
    }
}

Тогда вот мои коды в моем AppModule.java

@Module
public class AppModule {

    @Provides
    Retrofit provideRetrofit(Gson gson) {
        Retrofit retrofit = new Retrofit.Builder()
                .addConverterFactory(GsonConverterFactory.create(gson)) 
                .baseUrl("https://" + BuildConfig.SERVER_HOST)
                .build();
        return retrofit;
    }
}

При этом Retrofit сообщит, с каким хостом веб-сервиса он будет общаться, основываясь на BuildVariant, автоматически

0 голосов
/ 08 ноября 2018

Вы можете определить в build.gradle несколько типов разновидностей, таких как dev, prod и stage, и для каждой разновидности определить переменную конфигурации сборки

productFlavors {
    dev {
        buildConfigField "String", "SERVER_URL", "\"your dev url\""
    }
    stage {
        buildConfigField "String", "SERVER_URL", "\"your stage url\""
    }
    prod {
        buildConfigField "String", "SERVER_URL", "\"your prod url\""
    }
}

И после этого используйте его

private static String BASE_URL = BuildConfig.SERVER_URL;

Если вы хотите предоставить его динамически с помощью кинжала, вы можете сделать это следующим образом

@Module
public class AppModule {
    @Named("server_url")
    @Provides
    String provideServerUrl() {
        return "https://api.github.com/";
    }

    @Provides
    Retrofit provideRetrofit(Gson gson, @Named("server_url") String url) {
        Retrofit retrofit = new Retrofit.Builder()
            .addConverterFactory(GsonConverterFactory.create(gson))
            .baseUrl(url)
            .build();
        return retrofit;
    }
}

Другой способ динамического предоставления URL-адреса сервера с использованием кинжала - использование компоновщика. Например,

@Component(AppModule.class)
interface AppComponent {
    @Component.Builder
    interface Builder {
        @BindsInstance
        Builder serverUrl(@Named("server_url") String url);

        AppComponent build();
    }
}

@Module
public class AppModule {
    @Provides
    Retrofit provideRetrofit(Gson gson, @Named("server_url") String url) {
        Retrofit retrofit = new Retrofit.Builder()
            .addConverterFactory(GsonConverterFactory.create(gson))
            .baseUrl(url)
            .build();
        return retrofit;
    }
}

DaggerAppComponent.Builder()
    .appModule(new AppModule())
    .serverUrl("https://api.github.com/")
    .build();
...