首页 > 解决方案 > 使用 Dagger 在 Android 中清理架构

问题描述

我决定在我的项目中添加干净的架构,我在项目中添加了三个独立的模块:域、数据、演示(应用程序),并将代码分为三个模块。之后,我遇到了 Dagger 的问题,当我尝试构建应用程序时,它说它无法访问 WeatherDataApiService(这是我使用改造库发出 API 请求的接口)我将此接口转移到数据模块。一般来说,问题是我不明白如何正确组织依赖注入,以便类可以相互访问。问题是在构建 Dagger 时,对数据模块的访问是关闭的。问题是我需要正确分配模块之间的依赖关系。眼下,

这是接口 WeatherDataApiService

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 WeatherDataRepositoryImpl @Inject constructor(
    private val weatherDataApiService : WeatherDataApiService,
    private val mapper : WeatherDataMapper
) : WeatherDataRepository {
    override fun getWeatherData(
        city: String,
        days: Int,
        degreeType: String
    ): Single<WeatherData> =
        weatherDataApiService.getWeatherData(city, days, degreeType)
            .map { mapper.mapWeather(it) }
}

这是我使用存储库的用例代码

class FetchWeatherDataUseCase @Inject constructor(private val weatherDataRepository: WeatherDataRepository) {

    fun fetchWeatherData(city: String,days: Int,degreeType: String): Single<WeatherData> {
       return weatherDataRepository.getWeatherData(city,days,degreeType)
    }
}

这是域中的 Dagger 模块的代码

@Module
class WeatherDataRepositoryModule {

    @Provides
    @Singleton
    fun providerWeatherDataRepository(
        mapper: WeatherDataMapper,
        weatherDataApiService: WeatherDataApiService
    ): WeatherDataRepository =
        WeatherDataRepositoryImpl(
            weatherDataApiService,
            mapper
        )

    @Provides
    @Singleton
    fun providerApiService() = WeatherDataApiService()

    @Provides
    fun providerMapper() = WeatherDataMapper()
}

这是在presentation(app)中的Dagger模块的代码

@Module
class WeatherDataModule {

    @Provides
    @Singleton
    fun provideFetchWeatherDataUseCase(weatherDataRepository: WeatherDataRepository) =
        FetchWeatherDataUseCase(weatherDataRepository)
}

这是在presentation(app) 中的Dagger 组件的代码

@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()
    }
}

错误文本 - 无法访问 WeatherDataApiService

标签: androiddagger-2clean-architecture

解决方案


推荐阅读