ServiceContext
是一个最小化(零依赖)的上下文传播容器,旨在“携带”项目,以便构建在其之上的跨领域工具使用。
它的模型基于 W3C Baggage 中解释的概念,并且符合 Tracing Plane 的 “Baggage Context” 类型的精神,尽管它本身并未定义特定的序列化格式。
有关可用于部署各种跨领域工具并全部重用相同 baggage 类型的实际工具类型和实现,请参阅 https://github.com/apple/swift-distributed-tracing。 更多信息可以在 SSWG 会议记录 中找到。
ServiceContext
用作在 Swift 任务和函数之间传递额外上下文信息的货币类型。
通常从一个“顶层”(空)或“当前”(ServiceContext.current
)上下文开始,然后向其添加值。
上下文是一个值类型,并使用 task-local 值进行传播,因此可以安全地从并发上下文中使用,如下所示:
var context = ServiceContext.topLevel
context[FirstTestKey.self] = 42
func exampleFunction() async -> Int {
guard let context = ServiceContext.current {
return 0
}
guard let value = context[FirstTestKey.self] {
return 0
}
print("test = \(value)") // test = 42
return value
}
let c = ServiceContext.withValue(context) {
await exampleFunction()
}
assert(c == 42)
ServiceContext
是分布式追踪如何传播追踪标识符的基础构建块。
要依赖此库,您可以使用 Swift Package Manager,并将以下依赖项添加到您的 Package.swift
中:
dependencies: [
.package(
url: "https://github.com/apple/swift-service-context.git",
from: "1.0.0"
)
]
并在您的 target 中依赖该模块:
targets: [
.target(
name: "MyAwesomeApp",
dependencies: [
.product(
name: "ServiceContextModule",
package: "swift-service-context"
),
]
),
// ...
]