测试已测试 | ✓ |
Lang语言 | SwiftSwift |
许可 | MIT |
发布最新发布 | 2017年2月 |
SwiftSwift 版本 | 3.0 |
SPM支持 SPM | ✗ |
由 Syed Sabir Salman-Al-Musawi 管理。
图片来自 www.krakenstudios.blogspot.com
Kraken
是一个简单的 依赖注入容器。
它的目标是最简单,同时提供其他平台上 DI 容器常用丰富的功能。它受到了 Dip 和一些其他 DI 容器的启发。
实施类型
、一个 实现
或一个 工厂
相关联来实现。最好从 main.swift
中调用您的 Dependency Configurator
。inject(typeToInject)
来 根据您的依赖项配置器中的启动项解析一个指定协议或类型的实例。Kraken
尚未完全文档化,但它附带了一个示例项目,可以让您尝试所有功能,并熟悉 API。您可以在 Trigger.xcworkspace
中找到它。
如果您有任何疑问,可以提出问题。
要运行示例项目,首先克隆仓库,然后从 Example 目录运行 pod install
。
实施类型
、一个 实现
或一个 工厂
;实施类型
、实现
或 工厂
;创建一个依赖配置文件,其中引导你的依赖,就像下面示例中所展示的那样
import Kraken
class DependencyConfigurator {
static func bootstrapDependencies() {
// Register a protocol or type by providing its implementation type
Kraken.register(ServiceA.self, implementationType: ServiceAImpl.self, scope: .singleton)
// Register same protocol or type with different dependency by providing tag that can be either Int, String or Custom Type conforming to DependencyTagConvertible
Kraken.register(ServiceA.self, tag: CustomTag.One, implementationType: CustomFactory.self, scope: .singleton)
// Register a protocol or type by providing its implementation
Kraken.register(ServiceC.self, implementation: dummyImplementation, scope: .singleton)
// Register a protocol or type having weak property to allow Kraken to handle circular dependencies
// An example of such protocol (ServiceB) is given below
Kraken.register(ServiceB.self, implementationType: ServiceBImpl.self, scope: .singleton) {
(resolvedInstance: Injectable) -> () in
let serviceB = resolvedInstance as! ServiceBImpl
serviceB.serviceA = injectWeak(ServiceA.self).value as! ServiceAImpl
}
// Register a protocol or type having runtime arguments to be injected in constructor
Kraken.register(ServiceD.self) {
ServiceDImpl(host: $0, port: $1, serviceB: inject(ServiceB.self)) as ServiceD
}
// Register generic protocols or types
Kraken.register(GenericDataSource<ServiceAImpl>.self, implementationType: ServiceAImplDataSource.self, scope: .eagerSingleton)
// Register a protocol or type whose components' dependencies are injected automatically by container
Kraken.register(ServiceE.self) {
ServiceEImpl(serviceA: $0, serviceB: $1, serviceC: $2)
}
}
}
import Kraken
protocol ServiceB: Injectable {
weak var serviceA: ServiceA? { get set }
var serviceC: ServiceC { get set }
var serviceBImplDataSource: GenericDataSource<ServiceBImpl> { get set }
func myCompanyB() -> String
}
值得注意的是,注册的协议或类型必须符合以下示例中所示Injectable
协议,才能被容器解析
import Kraken
protocol ServiceA: Injectable {
func myCompanyA() -> String
}
如果你想要按照类型或协议注册多个依赖,你必须使用符合DependencyTagConvertible
的标记进行注册。你可以如以下所示声明一个自定义枚举
import Kraken
enum CustomTag: Int, DependencyTagConvertible {
case One = 1, Two
}
在引导依赖后,其注入就像调用inject()
一样简单,它可以如同以下示例中那样是不同类型
import Kraken
// Inject dependency whose implementation was registered
let serviceC: ServiceC = inject(ServiceC.self)
// Inject dependency whose implementation type was registered
let serviceA: ServiceA = inject(ServiceA.self)
// Inject dependency whose implementation type was registered with tag
let serviceA: ServiceA = inject(ServiceA.self, tag: CustomTag.One)
// Inject dependency providing runtime arguments
let serviceD: ServiceD = inject(ServiceD.self, withArguments: "localhost", 8080)
// Inject dependency which is resolved by container through AutoWiring
let serviceE: ServiceE = inject(ServiceE.self)
Kraken是用Swift 3.0构建的。
/Kraken
文件夹放入你的项目中。Syed Sabir Salman-Al-Musawi, [email protected]
我还要感谢在开发阶段给予巨大支持的Sharafat Ibn Mollah Mosharraf。
Kraken遵循MIT许可证。有关更多信息,请参阅LICENSE
文件。
此README.md
文件顶部的人脸GIF来自于www.krakenstudios.blogspot.com