使用Koin注入CoroutineDispatcher

4
我正在阅读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搜索也没有太多结果。

1
类似于这个。这只是一个问题,我现在找不到更好的了。请阅读评论。 - ADM
@ADM 谢谢,链接问题评论区的链接帮了我很大的忙。我很快会发布使用命名作用域的解决方案! - Stelios Papamichail
1个回答

10

感谢评论区@ADM提供的链接,我成功地使用了命名属性,就像这里所建议的那样。

在我的情况下,我首先为IO Dispatcher创建了命名属性,然后SubjectsLocalDataSource类使用get(named("IODispatcher"))调用获取其CoroutineDispatcher依赖项,最后,SubjectsRepository使用经典的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"))) }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接