一款为 Swinject 增加安全特性的工具。Knit 解析 Swinject 代码并生成 Swift 文件,以实现类型安全和单元测试。
Knit 被设计用来处理 Assembly 文件中的 Swinject 语法。然而,注册的一些重要方面并未在 Swinject 语法中体现。@knit
注释命令允许你使用这些额外信息来配置你的注册。
这是通过在注册上方直接添加以 // @knit
开头的注释,然后是配置命令来实现的。
有关命令列表,请参阅注释命令文档。
Knit 的核心功能之一是为你的注册生成类型安全的 getter/访问器。Assembly 中的每个注册都将被解析,并且类型安全的函数将被添加到生成的 Resolver 扩展中。
这允许调用点简单地使用 resolver()
,Swift 将使用类型推断来匹配适当的注册。
在某些情况下,更精确地控制调用点,指定你想要解析的注册会很有帮助。例如,这可能发生在单元测试场景中,其中可能存在现有协议注册的替代“测试”或“伪造”版本。命名 Getter 允许你编写 resolver.myType()
或 resolver.myTypeFake()
来专门解析 MyType
或 MyTypeFake
的注册。
在这两种情况下,方法调用都是类型安全的。
有关示例,请参阅类型安全注释命令文档
默认情况下,Knit 为其类型安全生成命名 getter。
随着应用程序的扩展,DI 注册的数量也会增加。检测重复注册非常重要,因为默认情况下 Swinject 会用任何重复项覆盖早期的注册。虽然此功能在测试环境中很有用,但在运行时它几乎总是表示编程/配置错误,这可能会导致错误。
Knit 包含两项功能,用于检测重复注册,以提高 DI 图的安全性
当 Knit 解析单个模块中的 assembly 文件时,它会自动检测解析期间发现的任何重复项,并立即报告包含重复项信息的错误。这始终开启且是自动的。
Knit 一次只解析单个模块中的 assembly,因此它无法在解析/编译时检测跨模块的重复项。相反,Knit 提供了一个 DuplicateRegistrationDetector
类,它是一个 Swinject Behavior。DuplicateRegistrationDetector
允许运行时检测对单个 Container(DI 图)所做的所有注册,无论这些注册来自哪个模块。这为你的整个 DI 图增加了防止重复注册的安全性。
应将 DuplicateRegistrationDetector 的实例添加到 Container 以使用此功能。配置步骤
DuplicateRegistrationDetector
的实例。DuplicateRegistrationDetector
实例的 detectedKeys
属性是否有重复项。请注意,DuplicateRegistrationDetector.Key
和 Array<DuplicateRegistrationDetector.Key>
上还有一些帮助程序,可帮助创建更易于阅读的报告/错误消息。
如果你想在注册重复项时收到通知,DuplicateRegistrationDetector
还提供了一个 duplicateWasDetected
闭包钩子。
位于Docs/Modules.md 文件中。
位于Docs/Release.md 文件中。
有关复制的依赖项的信息位于Docs/Swinject.md 文件中。