Resolver 是一个超轻量级的依赖注入/服务定位器框架,适用于 iOS 上的 Swift 5.x。
请注意,Resolver 最近的一些更新可能会破坏早期使用参数传递和/或命名服务的代码。 更多信息请参见下面的更新部分。
依赖注入框架支持控制反转设计模式。 抛开技术定义,依赖注入几乎可以归结为:
| 给予对象完成其工作所需的东西。
就是这样。依赖注入使我们能够编写松耦合的代码,因此更容易重用、模拟和测试。
更多信息请参见:依赖注入的简明介绍。
有六种经典的依赖注入策略:
Resolver 支持所有这些策略。点击链接查看简要描述、示例以及每种策略的优缺点。
说到注解,Resolver 现在支持使用 Swift 5.1 中的新属性包装器语法来解析服务。
class BasicInjectedViewController: UIViewController {
@Injected var service: XYZService
@LazyInjected var service2: XYZLazyService
@WeakLazyInjected var service3: XYZAnotherLazyService?
}
只需添加 Injected 关键字,您的依赖项将自动解析。 有关此策略和其他策略的更多信息,请参见注解文档。
还有一个 @InjectedObject
包装器,可以在 SwiftUI 视图中注入 Observable Objects。
Resolver 仅用单个文件中 700 多行实际代码实现,但它在这 700 行代码中包含了大量特性。
使用 Resolver 是一个简单的三步过程:
如前所述,Resolver 是一个超轻量级的依赖注入系统,仅用 700 多行代码实现,并且包含在单个文件中。
Resolver 也为性能而设计。 例如,SwinjectStoryboard 是一个很棒的依赖注入系统,但 Resolver 在解析依赖链时比 Swinject 快约 800%。
与其他一些系统不同,Resolver 使用 100% Swift 5 编写,没有 Objective-C 代码、方法交换或对 Objective-C 运行时的内部依赖。
此外,Resolver:
最后,借助自动类型推断,您还可以使用 Resolver 编写的依赖注入代码减少约 40-60%。
Resolver 支持 CocoaPods 和 Swift Package Manager。
pod "Resolver"
Resolver 本身只是一个源文件 (Resolver.swift),因此也可以简单地下载该文件并将其添加到您的项目中。
请注意,当前版本的 Resolver (1.4) 支持 Swift 5.3,并且此版本当前支持的 iOS 最低版本为 iOS 11。
阅读安装指南,了解有关支持早期版本的信息。
我已经公开了我的Builder 仓库。 这是一个简单的 master/detail 样式的 iOS 应用程序,其中包含以下示例:
我也用它来尝试一些使用 SwiftUI 风格的构建器模式来构建用户界面和构建网络请求的新代码。 去看看吧。
Resolver 的最新更新可能会导致您的代码库中出现重大更改。
Resolver 1.4 改进了线程安全性和性能。 没有重大更改,但是直接访问 Resolver 的作用域现在已被弃用。 请参阅:作用域。
Resolver 1.3 将命名空间添加到 Resolver。 注册名称可以提供更好的自动完成功能,并通过减少潜在的运行时评估错误来使您的代码更安全。 这是一个可能破坏现有代码的更改。 请参阅:命名实例
Resolver 1.2 更改了将参数传递给注册工厂的方式,以便更好地支持传递和处理单个和多个参数。 这是一个破坏现有代码的更改。 请参阅:传递和处理多个参数
Resolver 1.5 更新了 Resolver 中使用的几个注册和缓存机制。 除非你编写了一些依赖于 Resolver 内部行为的东西,否则这应该不是问题。
Resolver 由 Michael Long 设计、实现、记录和维护,他是 CRi Solutions 的高级首席 iOS 工程师。 CRi 是为我们的企业和金融客户开发前沿 iOS、Android 和移动 Web 应用程序和解决方案的领导者。
他还因其在 Resolver 上的工作而成为 2021 年 Google 的 开源同侪奖励 获奖者之一。
Resolver 在 MIT 许可证下可用。 有关更多信息,请参阅 LICENSE 文件。