Dep

Build Status

Dep 是一个微型框架,它使用服务定位器模式实现依赖注入,并提供了一种使用 @Dependency 属性包装器方便地使用这些依赖项的方法。

示例

基本用法示例

// Define a container and register your dependencies 
let container = Container()
       .register(AnyDecoder.self) { _ in JSONDecoder() }
       .register(AnyEncoder.self) { _ in JSONEncoder() }

// Resolve dependency using the previously defined container 
let dependency = container.resolve(AnyDecoder.self)

高级用法示例

可以注册一个期望以某种方式注入其依赖项的依赖项。 为此,请使用 factory 闭包参数。

let container = Container()
       .register(AnyDecoder.self) { _ in JSONDecoder() }
       .register(AnyEncoder.self) { _ in JSONEncoder() }
       .register(ComplexObject.self) { resolver in 
          let decoder = resolver.resolve(AnyDecoder.self)
          let encoder = resolver.resolve(AnyEncoder.self)
          return ComplexObject(decoder: decoder, encoder: encoder)
       }

// Resolve dependency using the previously defined container 
let dependency = container.resolve(ComplexObject.self)

@Dependency 属性包装器的用法

let defaultContainer = Container()
       .register(AnyDecoder.self) { _ in JSONDecoder() }
       .register(AnyEncoder.self) { _ in JSONEncoder() }


class ComplexObject {
  @Dependency(container: defaultContainer) var decoder: AnyDecoder 
  @Dependency(container: defaultContainer) var encoder: AnyEncoder
}

单元测试

为了测试使用 @Dependency 属性包装器的类,可以覆盖用于定义依赖项的容器。

let testContainer = Container()
    .register(AnyDecoder.self) { _ in JSONDecoder() }
    .register(AnyEncoder.self) { _ in JSONEncoder() }
    .register(ComplexObject.self) { resolver in
        var result = ComplexObject()
        result.$decoder.container = resolver // overwrites decoder container
        result.$encoder.container = resolver
        return result
    }

class ComplexObjectsTests: XCTestCase {
  @Dependency(container: testContainer) var complexObject: ComplexObject

  func testThatItWorks() {
    XCTAssertTrue(complexObject.doesSomething())
  }
}

安装

Swift 包管理器

Swift 包管理器是一个用于自动化 Swift 代码分发的工具,它已集成到 Swift 编译器中。

设置好 Swift 包后,添加 Dep 作为依赖项就像将其添加到 Package.swift 的 dependencies 值一样简单,或者自 XCode 11 以来,您可以通过 XCode UI 完成相同的操作。

dependencies: [
    .package(url: "https://github.com/kshin/Dep.git", from: "1.0.2")
]

要求

许可

MIT 许可证 (MIT)

版权所有 (c) 2019 Ivan Lisovyi

特此授予任何人免费获得本软件及相关文档文件(“软件”)副本的许可,以不受限制地处理本软件,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或出售本软件的副本,并允许向提供本软件的人员提供本软件,但须符合以下条件:

上述版权声明和本许可声明应包含在本软件的所有副本或主要部分中。

本软件按“原样”提供,不作任何明示或暗示的保证,包括但不限于对适销性、特定用途适用性和不侵权的保证。 在任何情况下,作者或版权持有人均不对任何索赔、损害或其他责任负责,无论是在合同、侵权或其他方面,因本软件或本软件的使用或其他交易而引起的或与之相关的任何行为、侵权或其他责任。