使用Dagger的Android清洁架构
我决定在我的项目中添加干净的架构,我在项目中添加了三个独立的模块:域、数据、表示(app),并将代码分为三个模块。之后,我遇到了Dagger的问题,当我尝试构建应用程序时,它说它无法访问WeatherDataAPI服务(这是我使用改装库发出API请求的接口),我将此接口传输到数据模块。一般来说,问题是我不理解如何正确地组织依赖项注入,以便类可以相互访问。问题是,当Dagger正在构建时,对数据模块的访问被关闭。问题是我需要在模块之间正确地分配依赖关系。目前,模块之间的依赖关系是以这种方式构建的——表示(app)依赖于域模块,域模块依赖于数据模块 这是WeatherDataAPI服务的接口使用Dagger的Android清洁架构,android,dagger-2,clean-architecture,Android,Dagger 2,Clean Architecture,我决定在我的项目中添加干净的架构,我在项目中添加了三个独立的模块:域、数据、表示(app),并将代码分为三个模块。之后,我遇到了Dagger的问题,当我尝试构建应用程序时,它说它无法访问WeatherDataAPI服务(这是我使用改装库发出API请求的接口),我将此接口传输到数据模块。一般来说,问题是我不理解如何正确地组织依赖项注入,以便类可以相互访问。问题是,当Dagger正在构建时,对数据模块的访问被关闭。问题是我需要在模块之间正确地分配依赖关系。目前,模块之间的依赖关系是以这种方式构建的—
interface WeatherDataApiService {
@GET("/v2.0/forecast/daily")
fun getWeatherData(
@Query("city") city: String,
@Query("days") days: Int,
@Query("units") degreeType: String
):Single<WeatherDataApiModel>
companion object {
operator fun invoke(): WeatherDataApiService {
val key = "40a7956799be42f49bc8b6ac4bb8e432"
val requestInterceptor = Interceptor{chain->
val url = chain.request()
.url() // HttpUrl
.newBuilder() // HttpUrl.Builder
.addQueryParameter("key", key) // HttpUrl.Builder
.build()
val request = chain.request()
.newBuilder() // Request.Builder
.url(url) // Request.Builder
.build() // Request
return@Interceptor chain.proceed(request) // Response
}
val okHttpClient = OkHttpClient.Builder()
.addInterceptor(requestInterceptor) // OkHttpClient.Builder()
.build()
return Retrofit.Builder()
.client(okHttpClient)
.baseUrl("https://api.weatherbit.io")
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava3CallAdapterFactory.create())
.build()
.create(WeatherDataApiService::class.java)
}
}
这是演示文稿(app)中匕首模块的代码
这是演示文稿(app)中匕首组件的代码
这里我正在创建一把匕首,代码在演示文稿中(应用程序)
错误文本-无法访问WeatherDataAPI服务
interface WeatherDataApiService {
@GET("/v2.0/forecast/daily")
fun getWeatherData(
@Query("city") city: String,
@Query("days") days: Int,
@Query("units") degreeType: String
):Single<WeatherDataApiModel>
companion object {
operator fun invoke(): WeatherDataApiService {
val key = "40a7956799be42f49bc8b6ac4bb8e432"
val requestInterceptor = Interceptor{chain->
val url = chain.request()
.url() // HttpUrl
.newBuilder() // HttpUrl.Builder
.addQueryParameter("key", key) // HttpUrl.Builder
.build()
val request = chain.request()
.newBuilder() // Request.Builder
.url(url) // Request.Builder
.build() // Request
return@Interceptor chain.proceed(request) // Response
}
val okHttpClient = OkHttpClient.Builder()
.addInterceptor(requestInterceptor) // OkHttpClient.Builder()
.build()
return Retrofit.Builder()
.client(okHttpClient)
.baseUrl("https://api.weatherbit.io")
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava3CallAdapterFactory.create())
.build()
.create(WeatherDataApiService::class.java)
}
}
class FetchWeatherDataUseCase @Inject constructor(private val weatherDataRepository: WeatherDataRepository) {
fun fetchWeatherData(city: String,days: Int,degreeType: String): Single<WeatherData> {
return weatherDataRepository.getWeatherData(city,days,degreeType)
}
}
@Module
class WeatherDataRepositoryModule {
@Provides
@Singleton
fun providerWeatherDataRepository(
mapper: WeatherDataMapper,
weatherDataApiService: WeatherDataApiService
): WeatherDataRepository =
WeatherDataRepositoryImpl(
weatherDataApiService,
mapper
)
@Provides
@Singleton
fun providerApiService() = WeatherDataApiService()
@Provides
fun providerMapper() = WeatherDataMapper()
}
@Module
class WeatherDataModule {
@Provides
@Singleton
fun provideFetchWeatherDataUseCase(weatherDataRepository: WeatherDataRepository) =
FetchWeatherDataUseCase(weatherDataRepository)
}
@Singleton
@Component(modules = [WeatherDataModule::class, WeatherDataRepositoryModule::class])
interface WeatherDataComponent {
fun injectWeatherDataFragment(weatherDataFragment: WeatherDataFragment)
}
class App : Application() {
lateinit var weatherDataComponent: WeatherDataComponent
override fun onCreate() {
super.onCreate()
weatherDataComponent = DaggerWeatherDataComponent.create()
}
}