NamadaInject
NamadaInject 是一个简单的 Swift 依赖注入库
示例
要运行示例项目,首先克隆仓库,然后在 Example 目录中运行 pod install
要求
安装
NamadaInject 可以通过 CocoaPods 提供。要安装它,只需将以下行添加到您的 Podfile 中
pod 'NamadaInject'
作者
nayanda, [email protected]
许可证
NamadaInject遵循MIT许可证。详情请参阅LICENSE文件。
基本用法
NamadaInject非常容易使用,只需要提供一些依赖的提供者
NamadaInjector.provide(for: Dependency.self, SomeDependency())
然后在你的类中使用属性包装器或者使用全局函数来使用它
class InjectedByPropertyWrapper {
@Injected var dependency: Dependency
...
...
}
class InjectedByInit {
var dependency: Dependency
init(dependency: Dependency = inject()) {
self.dependency = dependency
}
}
提供者是自动闭包类型的,所以你可以这样做
NamadaInjector.provide(for: Dependency.self) {
dependency: SomeDependency = .init()
dependency.doSomeSetup()
return dependency
}
提供者会自动只创建一个实例。如果你想让提供者为每次注入创建新实例,你可以传递选项
NamadaInjector.provide(for: Dependency.self, option: .alwaysNew, SomeDependency())
或者如果你想显式将其设置为单例
NamadaInjector.provide(for: Dependency.self, option: .singleton, SomeDependency())
别忘了,如果没有注册提供者,它会抛出不可捕获的错误。如果你想手动捕获错误,只需使用tryInject
代替
class InjectedByInit {
var dependency: Dependency
init(dependency: Dependency? = nil) {
do {
self.dependency = dependency ?? try tryInject()
} catch {
self.dependency = DefaultDependency()
}
}
}
不匹配规则
如果NamadaInjector没有找到完全匹配的类型但找到了多个兼容类型,它将使用与请求类型最接近的一个。
protocol Dependency {
...
...
}
class MyDependency: Dependency {
...
...
}
class YourDependency: MyDependency {
...
...
}
class OurDependency: YourDependency {
...
...
}
你可以这样注册你的依赖项
NamadaInjector.provide(for: Dependency.self, MyDependency())
NamadaInjector.provide(for: YourDependency.self, YourDependency())
NamadaInjector.provide(for: OurDependency.self, OurDependency())
结果将是
class InjectedByPropertyWrapper {
@Injected var thisWillBeMyDependency: Dependency
@Injected var thisWillBeYourDependency: MyDependency
@Injected var thisWillBeYourDependencyToo: YourDependency
@Injected var thisWillBeOurDependency: OurDependency
...
...
}
class InjectedByInit {
var thisWillBeMyDependency: Dependency
var thisWillBeYourDependency: MyDependency
var thisWillBeYourDependencyToo: YourDependency
var thisWillBeOurDependency: OurDependency
init(thisWillBeMyDependency: Dependency = inject(),
thisWillBeYourDependency: MyDependency = inject(),
thisWillBeYourDependencyToo: YourDependency = inject(),
thisWillBeOurDependency: OurDependency = inject()) {
self.thisWillBeMyDependency = thisWillBeMyDependency
self.thisWillBeYourDependency = thisWillBeYourDependency
self.thisWillBeYourDependencyToo = thisWillBeYourDependencyToo
self.thisWillBeOurDependency = thisWillBeOurDependency
}
}
如果你更愿意使用已注册的最远类型,则可以在propertyWrapper或inject函数中传递规则,如以下所示
class InjectedByPropertyWrapper {
@Injected(ifNoMatchUse: .furthestType)
var thisWillBeMyDependency: Dependency
@Injected(ifNoMatchUse: .furthestType)
var thisWillBeOurDependency: MyDependency
@Injected(ifNoMatchUse: .furthestType)
var thisWillBeYourDependency: YourDependency
@Injected(ifNoMatchUse: .furthestType)
var thisWillBeOurDependencyToo: OurDependency
...
...
}
class InjectedByInit {
var thisWillBeMyDependency: Dependency
var thisWillBeOurDependency: MyDependency
var thisWillBeYourDependency: YourDependency
var thisWillBeOurDependencyToo: OurDependency
init(thisWillBeMyDependency: Dependency = inject(ifNoMatchUse: .furthestType),
thisWillBeOurDependency: MyDependency = inject(ifNoMatchUse: .furthestType),
thisWillBeYourDependency: YourDependency = inject(ifNoMatchUse: .furthestType),
thisWillBeOurDependencyToo: OurDependency = inject(ifNoMatchUse: .furthestType)) {
self.thisWillBeMyDependency = thisWillBeMyDependency
self.thisWillBeOurDependency = thisWillBeOurDependency
self.thisWillBeYourDependency = thisWillBeYourDependency
self.thisWillBeOurDependencyToo = thisWillBeOurDependencyToo
}
}
贡献
你知道怎么做,只需克隆并提交pull request即可