InjectableSwift 0.2.0

InjectableSwift 0.2.0

Nicholas Cross 维护。



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)
    }
}