Needle 是一个适用于 Swift 的依赖注入(DI)系统。与例如 Cleanse、Swinject 这样的其他 DI 框架不同,Needle 鼓励 层次化的 DI 结构,并利用代码生成来确保编译时安全。这使得我们能够自信地开发应用程序和进行代码更改。如果编译通过,那就是有效的。从这个角度看,Needle 更接近于 JVM 的 Dagger。
Needle 旨在实现以下主要目标
- 通过确保依赖项注入代码的编译时安全性来提供高可靠性。
- 即使与多达数百万行的代码库一起使用,也确保代码生成性能高速。
- 与所有 iOS 应用程序架构兼容,包括 RIBs、MVx 等。
概要
使用 Needle 编写应用程序的 DI 代码既简单又安全。每个依赖项范围由一个 Component
定义,其依赖项封装在 Swift protocol
中。这两个使用 Swift 泛型链接在一起。
/// This protocol encapsulates the dependencies acquired from ancestor scopes.
protocol MyDependency: Dependency {
/// These are objects obtained from ancestor scopes, not newly introduced at this scope.
var chocolate: Food { get }
var milk: Food { get }
}
/// This class defines a new dependency scope that can acquire dependencies from ancestor scopes
/// via its dependency protocol, provide new objects on the DI graph by declaring properties,
/// and instantiate child scopes.
class MyComponent: Component<MyDependency> {
/// A new object, hotChocolate, is added to the dependency graph. Child scope(s) can then
/// acquire this via their dependency protocol(s).
var hotChocolate: Drink {
return HotChocolate(dependency.chocolate, dependency.milk)
}
/// A child scope is always instantiated by its parent(s) scope(s).
var myChildComponent: MyChildComponent {
return MyChildComponent(parent: self)
}
}
基本上就是这样,使用 Needle 编写 DI 代码。如您所见,一切都是真实的、可编译的 Swift 代码。没有脆弱的注释或“注释”。为了快速回顾,这里的三个关键概念是依赖协议、组件和子组件实例化。请参阅下面的使用 Needle 入门部分以了解更多详细说明和高级主题。
使用 Needle 入门
使用和集成 Needle 有两个步骤。以下每个步骤都有详细的说明和解释,请参阅链接文档。
安装
Needle由两部分组成,即NeedleFoundation
框架和可执行代码生成器。为了使用Needle作为依赖注入系统,这两部分都需要与您的Swift项目进行集成。
NeedleFoundation
框架
安装Carthage
使用请遵循Carthage安装流程的规范,将NeedleFoundation
框架集成到您的Swift项目中。
github "https://github.com/uber/needle.git" ~> VERSION_OF_NEEDLE
Swift Package Manager
使用请使用标准Swift Package Manager包定义过程,将Needle指定为依赖项,以便将NeedleFoundation
框架集成到您的Swift项目中。
dependencies: [
.package(url: "https://github.com/uber/needle.git", .upToNextMajor(from: "VERSION_NUMBER")),
],
targets: [
.target(
name: "YOUR_MODULE",
dependencies: [
"NeedleFoundation",
]),
],
CocoaPods
使用请遵循标准的pod集成流程,并使用NeedleFoundation
pod。
安装代码生成器
Carthage
使用如果使用 Carthage 集成 NeedleFoundation
框架,那么相应版本的代码生成器可执行文件已被下载到 Carthage 文件夹中。它位于 Carthage/Checkouts/needle/Generator/bin/needle
。
Homebrew
使用无论如何将 NeedleFoundation
框架集成到项目中,都可以通过 Homebrew 安装生成器。
brew install needle
为什么使用依赖注入?
该链接文档使用一个较为真实的示例来解释什么是依赖注入模式以及其优点。
相关项目
如果你喜欢 Needle,请查看我们团队的其他相关的开源项目
- Swift Concurrency:一组由 Uber 使用的并发实用类,受等效的 java.util.concurrent 包类启发。
- Swift Abstract Class:一个轻量级库以及一个可执行文件,它使 Swift 项目的抽象类开发在编译时安全。
- Swift Common:一组 Swift 开源项目使用的通用库。