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)
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 包后,添加 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
特此授予任何人免费获得本软件及相关文档文件(“软件”)副本的许可,以不受限制地处理本软件,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或出售本软件的副本,并允许向提供本软件的人员提供本软件,但须符合以下条件:
上述版权声明和本许可声明应包含在本软件的所有副本或主要部分中。
本软件按“原样”提供,不作任何明示或暗示的保证,包括但不限于对适销性、特定用途适用性和不侵权的保证。 在任何情况下,作者或版权持有人均不对任何索赔、损害或其他责任负责,无论是在合同、侵权或其他方面,因本软件或本软件的使用或其他交易而引起的或与之相关的任何行为、侵权或其他责任。