TriforkSwift依赖注入 💉

动机

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 告诉你,该实例未注册。