TriforkSwiftDependencyInjection 是一个超轻量级的、基于属性包装器的依赖注入框架。它支持简单的类型特定解析,也支持基于键的解析。
支持 Swift Package Manager。
以下模型将被用于展示后续章节中的示例
protocol Bread { }
protocol Chocolate { }
struct Croissant : Bread { }
struct PainAuChocolat : Bread, Chocolate { }
protocol Worker { }
class MySingleton : Worker {
static let shared = MySingleton()
private init() { }
}
protocol Planet { }
class Earth : Planet {
}
工厂函数可以通过 Resolver 使用协议类型或键进行注册。
Resolver.shared.register(Bread.self, { PainAuChocolat() }) //Result: Will inject new `PainAuChocolat` instances for `Bread` properties.
Resolver.shared.register(Bread.self, key: "🥐", { Croissant() }) //Result: Will inject new `Croissant` instances for `Bread` properties tagged with `"🥐"` key.
// Singletons can be injected in different ways depending on your implementation:
Resolver.shared.register(Worker.self, { MySingleton.shared }) //Result: Will inject the singleton instance of `MySingleton` for `Worker` properties, by invoking the function
Resolver.shared.registerAsSingleton(Worker.self, MySingleton.shared) //Result: Will inject the singleton instance of `MySingleton` for `Worker` properties
Resolver.shared.registerAsSingleton(Planet.self, Earth()) //Result: Will inject the provided instance of `Earth` as singleton for `Planet` properties
注意: 键仅对其注册的特定类型是唯一的。 这意味着 "🥐"
键仍然可以用于 Chocolate
协议,即使它已被用于 Bread
。
通过使用 Inject
属性包装器,您将能够根据注册解析实例。
class Bakery {
@Inject var bread: Bread // Will be injected with PainAuChocolat()
@Inject("🥐") var bread2: Bread // Will be injected with Croissant()
}
它会失败,并出现一个 fatalError
告诉你,你正在多次注册相同的键。 但是,如果你真的想这样做,可以通过设置 allowOverride
属性来实现。
Resolver.shared.allowOverride = true
它会失败,并出现一个 fatalError
告诉你,该实例未注册。