Injectable
一个 Swift 依赖注入容器,它最大限度地减少了集中式注册的需求
特性
- 支持不预先在容器中注册类型的依赖项解析
- 支持基于对象生命周期策略解析相同的对象,持久化、短暂的或短暂的
- 支持引用和值类型
- 支持解析具有不同键的同一类型的多个变体
- 支持注册接口类型以允许在直接不可用实现类的情况下解析依赖项
- 支持解析互相依赖的具有循环依赖关系的类
权衡与限制
- 无注册解析需要解析的确切类型的可见性
- 通过接口解析解决问题解决了解析的类型可见性的需要,但需要注册,这种注册在编译时没有强制执行,这意味着如果省略了注册,可能会在运行时失败
- 依赖注入框架与注入类型通过协议一致性的耦合
使用示例
更多使用示例请见此处
import Foundation
import XCTest
@testable import Injectable
private protocol Animal { }
private protocol Person {
var pet: Animal { get }
}
private struct Cat: Animal, Injectable {
static func create(inContainer container: Container, variant: String?) -> Cat {
return Cat()
}
}
private struct CatPerson: Person, Injectable {
let pet: Animal
static func create(inContainer container: Container, variant: String?) -> CatPerson {
return CatPerson(pet: container.resolve() as Cat)
}
init(pet: Animal) {
self.pet = pet
}
}
class ReadMeTests: XCTestCase {
private var container: DependencyContainer!
override func setUp() {
container = DependencyContainer()
}
func testResolve() {
let catPerson: CatPerson = container.resolve()
let person: Person = container.resolve() as CatPerson
XCTAssertTrue(catPerson.pet is Cat)
XCTAssertTrue(person.pet is Cat)
}
}