使用 Koin 注入 CoroutineDispatcher

Injecting a CoroutineDispatcher using Koin

我正在阅读 Google 的 data layer guide,在链接的部分中,他们有以下片段:

class NewsRemoteDataSource(
  private val newsApi: NewsApi,
  private val ioDispatcher: CoroutineDispatcher
) {
    /**
     * Fetches the latest news from the network and returns the result.
     * This executes on an IO-optimized thread pool, the function is main-safe.
     */
    suspend fun fetchLatestNews(): List<ArticleHeadline> =
        // Move the execution to an IO-optimized thread since the ApiService
        // doesn't support coroutines and makes synchronous requests.
        withContext(ioDispatcher) {
            newsApi.fetchLatestNews()
        }
    }
}

// Makes news-related network synchronous requests.
interface NewsApi {
    fun fetchLatestNews(): List<ArticleHeadline>
}

使用 Koin 注入 NewsApi 依赖项非常简单,但是如何使用 Koin 注入 CoroutineDispatcher 实例?我使用了 Koin 网站上的搜索功能,但没有找到任何结果。过滤后的 ddg 搜索也不会产生很多结果。

感谢 @ADM 的 link 评论,我设法按照建议 .

使用了命名 属性

在我的例子中,我首先为 IO Dispatcher 创建命名的 属性,然后 SubjectsLocalDataSource class 使用 get(named("IODispatcher")) 调用获取其 CoroutineDispatcher 依赖项,最后,SubjectsRepository 获取它的数据源依赖使用 classic get() 调用。

SubjectsLocalDataSource 声明:

class SubjectsLocalDataSource(
    private val database: AppDatabase,
    private val ioDispatcher: CoroutineDispatcher
)

SubjectsRepository 声明:

class SubjectsRepository(private val subjectsLocalDataSource: SubjectsLocalDataSource)

最后,在我的 Koin 模块中:

single(named("IODispatcher")) {
    Dispatchers.IO
}

// Repositories
single { SubjectsRepository(get()) }

// Data sources
single { SubjectsLocalDataSource(get(), get(named("IODispatcher"))) }