Resolver icon

Resolver 是一个超轻量级的依赖注入/服务定位器框架,适用于 iOS 上的 Swift 5.x。

请注意,Resolver 最近的一些更新可能会破坏早期使用参数传递和/或命名服务的代码。 更多信息请参见下面的更新部分。

简介

依赖注入框架支持控制反转设计模式。 抛开技术定义,依赖注入几乎可以归结为:

| 给予对象完成其工作所需的东西。

就是这样。依赖注入使我们能够编写松耦合的代码,因此更容易重用、模拟和测试。

更多信息请参见:依赖注入的简明介绍。

依赖注入策略

有六种经典的依赖注入策略:

  1. 接口注入
  2. 属性注入
  3. 构造器注入
  4. 方法注入
  5. 服务定位器
  6. 注解 (新增)

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 是一个简单的三步过程:

  1. 将 Resolver 添加到您的项目中。
  2. 注册您的应用程序需要的类和服务。
  3. 在需要时使用 Resolver 解析这些实例。

为什么选择 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 应用程序,其中包含以下示例:

  1. 使用 Resolver 依赖注入系统来构建 MVVM 架构。
  2. 使用 Resolver 模拟应用程序开发的用户数据。
  3. 使用 Resolver 模拟单元测试的用户数据。

我也用它来尝试一些使用 SwiftUI 风格的构建器模式来构建用户界面和构建网络请求的新代码。 去看看吧。

Resolver 更新说明

Resolver 的最新更新可能会导致您的代码库中出现重大更改。

作者

Resolver 由 Michael Long 设计、实现、记录和维护,他是 CRi Solutions 的高级首席 iOS 工程师。 CRi 是为我们的企业和金融客户开发前沿 iOS、Android 和移动 Web 应用程序和解决方案的领导者。

他还因其在 Resolver 上的工作而成为 2021 年 Google 的 开源同侪奖励 获奖者之一。

许可证

Resolver 在 MIT 许可证下可用。 有关更多信息,请参阅 LICENSE 文件。

其他资源