在我的
Android项目中,我使用以下
Retrofit ApiModule作为一个API端点.请注意,我使用
Dagger注入依赖项.
@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时扩展给定的ApiModule?或者我不应该延长它?我已经尝试复制模块了.但这涉及到我必须复制Endpoint,ObjectMapper和…… RestAdapter有一个私有的构造函数 – 所以我不能.
解决方法
我猜你可以使用Named annotations:
@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)); } }
现在,在您注入ProductsService的任何地方,您都需要使用@Named(PRODUCTS)或@Named(SUBSIDIARIES)注释依赖项,具体取决于您需要的变体.当然,除了@Named注释,您还可以创建自己的自定义注释并使用它们.请参阅“限定符”下的here.
要稍微展平模块,可以将RestAdapter的创建移动到provide * Service()方法中,并取消提供* RestAdapter()方法.当然,除非你需要RestAdapters作为模块之外的依赖项.
原文地址:https://www.jb51.cc/android/314465.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。