Android 如何使用改型解决多个API端点?

Android 如何使用改型解决多个API端点?,android,rest,retrofit,Android,Rest,Retrofit,在我的Android项目中,我将以下ApiModule用于oneAPI端点。请注意,我用于注入依赖项 @Module( complete = false, library = true ) public final class ApiModule { public static final String PRODUCTS_BASE_URL = "https://products.com"; @Provides @Singleton

在我的Android项目中,我将以下
ApiModule
用于oneAPI端点。请注意,我用于注入依赖项

@Module(
        complete = false,
        library = true
)
public final class ApiModule {

    public static final String PRODUCTS_BASE_URL = "https://products.com";

    @Provides
    @Singleton
    Endpoint provideEndpoint() {
        return Endpoints.newFixedEndpoint(PRODUCTS_BASE_URL);
    }

    @Provides
    @Singleton
    ObjectMapper provideObjectMapper() {
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setPropertyNamingStrategy(
            PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES);
        return objectMapper;
    }

    @Provides
    @Singleton
    RestAdapter provideRestAdapter(
        Endpoint endpoint, ObjectMapper objectMapper) {
        return new RestAdapter.Builder()
                .setLogLevel(RestAdapter.LogLevel.NONE)
                .setEndpoint(endpoint)
                .setConverter(new JacksonConverter(objectMapper))
                .build();
    }

    @Provides
    @Singleton
    ProductsService provideProductsService(RestAdapter restAdapter) {
        return restAdapter.create(ProductsService.class);
    }

}

现在,还有另一个API(例如,
)http://subsidiaries.com“
)我想与之通信。在重用
ObjectMapper
RestAdapter
的同时,是否可以扩展给定的
apimule
?还是我不应该延长?我已经尝试复制模块。但这涉及到我必须复制
端点
对象映射器
和。。。
RestAdapter
有一个private构造函数,所以我不能。我想你可以使用
命名的
注释:

@Module(
        complete = false,
        library = true
)
public final class ApiModule {

    public static final String PRODUCTS_BASE_URL = "https://products.com";
    public static final String SUBSIDIARIES_BASE_URL = "https://subsidiaries.com";

    public static final String PRODUCTS = "products";
    public static final String SUBSIDIARIES = "subsidiaries";

    @Provides
    @Singleton
    @Named(PRODUCTS)
    Endpoint provideProductsEndpoint() {
        return Endpoints.newFixedEndpoint(PRODUCTS_BASE_URL);
    }

    @Provides
    @Singleton
    @Named(SUBSIDIARIES)
    Endpoint provideSubsidiariesEndpoint() {
        return Endpoints.newFixedEndpoint(SUBSIDIARIES_BASE_URL);
    }

    @Provides
    @Singleton
    ObjectMapper provideObjectMapper() {
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setPropertyNamingStrategy(
            PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES);
        return objectMapper;
    }

    @Provides
    @Singleton
    @Named(PRODUCTS)
    RestAdapter provideProductsRestAdapter(@Named(PRODUCTS) Endpoint endpoint, ObjectMapper objectMapper) {
        return newRestAdapterBuilder(objectMapper)
                .setEndpoint(endpoint)
                .build();
    }

    @Provides
    @Singleton
    @Named(SUBSIDIARIES)
    RestAdapter provideSubsidiariesRestAdapter(@Named(SUBSIDIARIES) Endpoint endpoint, ObjectMapper objectMapper) {
        return newRestAdapterBuilder(objectMapper)
                .setEndpoint(endpoint)
                .build();
    }

    @Provides
    @Singleton
    @Named(PRODUCTS)
    ProductsService provideProductsService(@Named(PRODUCTS) RestAdapter restAdapter) {
        return restAdapter.create(ProductsService.class);
    }

    @Provides
    @Singleton
    @Named(SUBSIDIARIES)
    ProductsService provideSubsidiariesService(@Named(SUBSIDIARIES) RestAdapter restAdapter) {
        return restAdapter.create(ProductsService.class);
    }

    private RestAdapter.Builder newRestAdapterBuilder(ObjectMapper objectMapper) {
        return new RestAdapter.Builder()
                       .setLogLevel(RestAdapter.LogLevel.NONE)
                       .setConverter(new JacksonConverter(objectMapper));
    }
}
现在,无论您在哪里注入
产品服务
,您都需要使用
@命名(产品)
@命名(子公司)
注释依赖关系,具体取决于您需要的变体。当然,您也可以创建自己的自定义注释并使用它们,而不是
@命名的
注释。请参阅“限定符”下的内容


要稍微扁平化模块,您可以将RestAdapter的创建移到
provide*Service()
方法中,并去掉
provide*RestAdapter()
方法。当然,除非您需要重启适配器作为模块外的依赖项。

您不能创建
apimule
的构造函数,并在那里传递端点,并在所有方法中使用IF条件进行相应的编码吗?@SweetWisherツ 依赖项注入使用默认构造函数。因此,传递参数以手动处理不同的情况在这里没有帮助。