上下文参数 (Context Parameters) Experimental
这是 Kotlin 引入的一种全新的依赖注入方式,旨在解决“显式参数传递地狱”和“隐式 ThreadLocal 不安全”的问题。 它曾被称为 Context Receivers。
核心语法
开启实验性功能
该特性目前处于实验阶段。你需要手动在 build.gradle.kts 的 kotlinOptions 中添加编译器参数:
- Kotlin 1.7 - 1.9:
freeCompilerArgs += "-Xcontext-receivers" - Kotlin 2.0+: 请关注官方迁移指南,名称可能会变更为 Context Parameters。
使用 context(...) 关键字声明函数需要的环境。
kotlin
interface UserService {
fun findUser(): String
}
interface Logger {
fun log(msg: String)
}
// 声明:我不属于 UserService 或 Logger,但我运行需要它们
context(UserService, Logger)
fun createUser() {
log("Creating user") // 自动找到 Logger
val user = findUser() // 自动找到 UserService
}调用侧
调用时,必须确保当前作用域内存在所需的上下文对象。
kotlin
fun main() {
val myService = ...
val myLogger = ...
with(myService) {
with(myLogger) {
createUser() // ✅ 环境满足,调用成功
}
}
}优势
- 解耦: 业务逻辑不再死板地持有依赖引用。
- 多继承模拟: 函数可以同时拥有多个“接收者”,这是传统扩展函数 (
T.()) 做不到的。