一个超轻量级的依赖注入/服务定位框架,适用于 iOS 上的 Swift 5.2。
请注意,解析器最近的一些更新可能会破坏之前使用 多个参数传递 和/或 命名服务 的代码。更多详细信息,请参阅下面的 更新 部分。
介绍
依赖注入框架支持 控制反转 设计模式。忽略技术定义,依赖注入基本上可以归结为:
| 为对象提供其完成工作所需的东西。
就是这样。依赖注入允许我们编写松散耦合的代码,因此更容易重用、模拟和测试。
更多信息,请参阅:简单依赖注入介绍。
依赖注入策略
共有六种经典的依赖注入策略
解析器支持所有这些策略。请单击链接获取每种策略的简要描述、示例以及优缺点。
属性包装
谈到注解,Resolver现在支持使用Swift 5.1中新的属性包装语法来解析服务。
class BasicInjectedViewController: UIViewController {
@Injected var service: XYZService
@LazyInjected var service2: XYZLazyService
@WeakLazyInjected var service3: XYZAnotherLazyService?
}
只需添加注入关键字,您的依赖项将自动解析。有关更多信息和其它策略,请参阅注解文档。
功能
Resolver用单文件超过700行实际代码实现,但在这些700行代码中集成了大量功能。
- 自动类型推断
- 范围:应用程序、缓存、图形、共享和唯一
- 协议
- 可选类型
- 命名实例(Resolver 1.3现在支持安全命名空间!)
- 参数传递(Resolver 1.2现在内置了对多参数的支持!)
- 自定义容器和嵌套容器
- 循环依赖项支持
- Storyboard支持
使用Resolver
使用Resolver是一个简单的三步过程
为什么使用Resolver?
如前所述,Resolver是一个轻量级的依赖注入系统,代码量仅为700多行,并包含在一个文件中。
Resolver还针对性能进行设计。例如,SwinjectStoryboard是一个非常棒的依赖注入系统,但Resolver在解析依赖链方面比Swinject快大约800%。
与一些其他系统不同,Resolver完全用100%的Swift 5编写,没有Objective-C代码,方法交换或对Objective-C运行时的内部依赖。
此外,Resolver
- 已在生产代码中进行了测试。
- 线程安全(假设您的对象也具有线程安全)。(在1.4版本中更新。)
- 具有完整的单元测试集合。
- 文档完善。
最后,使用自动类型推断,您在使用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应用程序,其中包含以下示例...
- 使用Resolver依赖注入系统构建MVVM架构。
- 使用Resolver模拟应用程序开发过程中的用户数据。
- 使用Resolver模拟单元测试中的用户数据。
我还用它来尝试一些使用 SwiftUI 风格的构建器模式来构建用户界面和网络请求的新代码。检查一下。
Resolver更新说明
最近的更新可能会导致Resolver中的破坏性更改。
-
Resolver 1.4改进了线程安全和性能。没有破坏性变更,但是直接访问Resolver的作用域现在已被弃用。请参阅:作用域。
-
Resolver 1.3为Resolver添加了名称空间。注册名称可以提供更好的自动补全,并通过减少潜在运行时评估错误来提高代码的安全性。这是一个可能的破坏性更改。请参阅:命名实例。
-
Resolver 1.2更改了向注册工厂传递参数的方式,以提供对传递和处理单个和多个参数的更好支持。这是一个破坏性更改。请参阅:传递和处理多个参数。
作者
Resolver工具是由CRi Solutions公司的资深iOS负责人Michael Long设计、实施、编写文档并维护的。CRi Solutions是一家在为企业和金融机构开发尖端iOS、Android和移动网页应用及解决方案领域处于领先地位的公司。
- 邮箱:[email protected]
- 推特:@hmlco
许可协议
Resolver遵循MIT许可协议。有关更多信息,请参阅LICENSE文件。