Swift 服务上下文

Swift 5.7 Swift 5.8 Swift 5.9 Swift 5.10 Swift 6.0

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"
            ),
        ]
    ),
    // ...
]