一个超轻量的 Swift 5.x iOS 依赖注入/服务定位器框架。
注意:Resolver 现在已正式弃用,并被我的新依赖注入系统 Factory 取代。 Factory 是一个真正的基于容器的依赖注入系统,具有编译时安全特性,并且比 Resolver 更小、更轻、更快。 尽管 Resolver 很好,但 Factory 更好。
依赖注入框架支持 控制反转 设计模式。 抛开技术定义,依赖注入实际上归结为:
| 给对象提供它完成工作所需的东西。
就是这样。 依赖注入使我们能够编写松散耦合的代码,因此更容易重用、模拟和测试。
更多信息,请参阅: 依赖注入的简单介绍。
有六种经典的依赖注入策略:
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 行代码中。
TLDR:如果没有其他内容,请务必阅读关于 自动类型推断、 作用域 和 可选类型 的内容。
使用 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 内部行为的东西,否则这可能不是问题。
如果您想支持我在 Factory 和 Resolver 上的工作,请考虑 GitHub 赞助! 存在许多级别可以增加支持,甚至可以提供指导和公司培训。
或者你可以请我喝杯咖啡!
Resolver 由 Michael Long 设计、实现、记录和维护,他是一位首席 iOS 软件工程师,也是 Medium 上排名前 1,000 的技术作家。
Michael 也是 Google 在 2021 年因他在 Resolver 上的工作而获得的 开源同行奖励 获奖者之一。
Resolver 在 MIT 许可证下可用。 有关更多信息,请参见 LICENSE 文件。