使用Dagger的Android清洁架构

使用Dagger的Android清洁架构,android,dagger-2,clean-architecture,Android,Dagger 2,Clean Architecture,我决定在我的项目中添加干净的架构,我在项目中添加了三个独立的模块:域、数据、表示(app),并将代码分为三个模块。之后,我遇到了Dagger的问题,当我尝试构建应用程序时,它说它无法访问WeatherDataAPI服务(这是我使用改装库发出API请求的接口),我将此接口传输到数据模块。一般来说,问题是我不理解如何正确地组织依赖项注入,以便类可以相互访问。问题是,当Dagger正在构建时,对数据模块的访问被关闭。问题是我需要在模块之间正确地分配依赖关系。目前,模块之间的依赖关系是以这种方式构建的—

我决定在我的项目中添加干净的架构,我在项目中添加了三个独立的模块:域、数据、表示(app),并将代码分为三个模块。之后,我遇到了Dagger的问题,当我尝试构建应用程序时,它说它无法访问WeatherDataAPI服务(这是我使用改装库发出API请求的接口),我将此接口传输到数据模块。一般来说,问题是我不理解如何正确地组织依赖项注入,以便类可以相互访问。问题是,当Dagger正在构建时,对数据模块的访问被关闭。问题是我需要在模块之间正确地分配依赖关系。目前,模块之间的依赖关系是以这种方式构建的——表示(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)
    }
}
这是演示文稿(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()
    }
}