android - 使用 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
解决方案
推荐阅读
- github - 使用 API/Actions Pluginfor Jenkins 从 Jenkins Pipeline 触发 GitHub Actions
- ios - 仅当将相机向右横向旋转时,相机才会聚焦点击位置的对角线位置
- azure - AAD 连接升级 V2.0 后出现 dn-attributes-failure 错误
- google-analytics - Google Analytics - 一周后删除的用户 ID 数据
- linux - openssl-req 中 -signkey 选项的作用是什么?
- linux - NGINX 无法绑定到 Unix 套接字
- javascript - 仅在页面加载和页面刷新时使用效果
- c# - C#:为什么我的字符串返回对象类型而不是它包含的值?
- svelte - 使用 sanityClient 的 Svelte.js 和 Sanity.io 错误
- node.js - 在 lambda nodejs 12.0 上安装 libreoffice 但部署时无法运行命令