Knit

一款为 Swinject 增加安全特性的工具。Knit 解析 Swinject 代码并生成 Swift 文件,以实现类型安全和单元测试。

@knit 注释命令

Knit 被设计用来处理 Assembly 文件中的 Swinject 语法。然而,注册的一些重要方面并未在 Swinject 语法中体现。@knit 注释命令允许你使用这些额外信息来配置你的注册。

这是通过在注册上方直接添加以 // @knit 开头的注释,然后是配置命令来实现的。

有关命令列表,请参阅注释命令文档。

类型安全 Getter

Knit 的核心功能之一是为你的注册生成类型安全的 getter/访问器。Assembly 中的每个注册都将被解析,并且类型安全的函数将被添加到生成的 Resolver 扩展中。

作为函数 Getter 调用

这允许调用点简单地使用 resolver(),Swift 将使用类型推断来匹配适当的注册。

命名 Getter

在某些情况下,更精确地控制调用点,指定你想要解析的注册会很有帮助。例如,这可能发生在单元测试场景中,其中可能存在现有协议注册的替代“测试”或“伪造”版本。命名 Getter 允许你编写 resolver.myType()resolver.myTypeFake() 来专门解析 MyTypeMyTypeFake 的注册。

在这两种情况下,方法调用都是类型安全的。

命令

有关示例,请参阅类型安全注释命令文档

默认设置

默认情况下,Knit 为其类型安全生成命名 getter。

重复注册检测

随着应用程序的扩展,DI 注册的数量也会增加。检测重复注册非常重要,因为默认情况下 Swinject 会用任何重复项覆盖早期的注册。虽然此功能在测试环境中很有用,但在运行时它几乎总是表示编程/配置错误,这可能会导致错误。

Knit 包含两项功能,用于检测重复注册,以提高 DI 图的安全性

  1. 单个模块内的编译时检测。
  2. 整个容器图中的运行时检测。

编译时检测

当 Knit 解析单个模块中的 assembly 文件时,它会自动检测解析期间发现的任何重复项,并立即报告包含重复项信息的错误。这始终开启且是自动的。

运行时检测

Knit 一次只解析单个模块中的 assembly,因此它无法在解析/编译时检测跨模块的重复项。相反,Knit 提供了一个 DuplicateRegistrationDetector 类,它是一个 Swinject Behavior。DuplicateRegistrationDetector 允许运行时检测对单个 Container(DI 图)所做的所有注册,无论这些注册来自哪个模块。这为你的整个 DI 图增加了防止重复注册的安全性。

应将 DuplicateRegistrationDetector 的实例添加到 Container 以使用此功能。配置步骤

  1. 创建 DuplicateRegistrationDetector 的实例。
  2. 将该实例提供给你的 Container(ScopedModuleAssembler/ModuleAssembler/Assembler 也允许将 behaviors 传递到它们的初始化器中)。
  3. 执行 Container 设置的注册阶段。如果你使用的是 ScopedModuleAssembler/ModuleAssembler,那么注册阶段将在 initialer 返回后完成。
  4. 检查你的 DuplicateRegistrationDetector 实例的 detectedKeys 属性是否有重复项。

请注意,DuplicateRegistrationDetector.KeyArray<DuplicateRegistrationDetector.Key> 上还有一些帮助程序,可帮助创建更易于阅读的报告/错误消息。

如果你想在注册重复项时收到通知,DuplicateRegistrationDetector 还提供了一个 duplicateWasDetected 闭包钩子。


模块指南

位于Docs/Modules.md 文件中。

发布指南

位于Docs/Release.md 文件中。

Swinject 依赖项

有关复制的依赖项的信息位于Docs/Swinject.md 文件中。