1

你好我刚学 Koin,这个 Dagger2 类在 Koin 2.0 中如何提供?

@Singleton
open class AppExecutors(private val diskIO: Executor, private val networkIO: Executor, private val mainThread: Executor) {

    @Inject
    constructor() : this(
            Executors.newSingleThreadExecutor(),
            Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() + 1),
            MainThreadExecutor())

    fun diskIO(): Executor {
        return diskIO
    }

    fun networkIO(): Executor {
        return networkIO
    }

    fun mainThread(): Executor {
        return mainThread
    }

    private class MainThreadExecutor : Executor {
        private val mainThreadHandler = Handler(Looper.getMainLooper())
        override fun execute(command: Runnable) {
            mainThreadHandler.post(command)
        }
    }
}

我试过这个:

single<AppExecutors> { AppExecutors(
    Executors.newSingleThreadExecutor(),
    Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() + 1),
    AppExecutors.MainThreadExecutor())
}

但是AppExecutors.MainThreadExecutor()是私人的。公开它是唯一的解决方案吗?

4

1 回答 1

2

好吧,使用 DI 从外部注入私有实现细节是一个有点奇怪的想法。

此外,Dagger2 中的解决方案是一个实际上围绕依赖注入工作的技巧。

所以你需要做出决定:我是否希望它成为一个私有的实现细节?如果是,我建议使用默认参数值并仅在需要覆盖此实现(例如进行测试)时使用注入。

open class AppExecutors(
    private val diskIO: Executor, 
    private val networkIO: Executor, 
    private val mainThread: Executor = AppExecutors.MainThreadExecutor()) {

和:

single<AppExecutors> { AppExecutors(
    Executors.newSingleThreadExecutor(),
    Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() + 1)))
}

(请记住,在 Kotlin 中使用默认参数值最终与在原始示例中使用多个构造函数相同。)

否则,您应该将其公开并从课程中提取。

于 2019-02-05T14:59:00.140 回答