Kraken 1.5.0

Kraken 1.5.0

测试已测试
Lang语言 SwiftSwift
许可 MIT
发布最新发布2017年2月
SwiftSwift 版本3.0
SPM支持 SPM

Syed Sabir Salman-Al-Musawi 管理。



Kraken 1.5.0

Kraken

Code Climate

Kraken GIF 图片来自 www.krakenstudios.blogspot.com

简介

Kraken 是一个简单的 依赖注入容器

它的目标是最简单,同时提供其他平台上 DI 容器常用丰富的功能。它受到了 Dip 和一些其他 DI 容器的启发。

  • 您首先为启动和 注册依赖项创建一个依赖项配置器,通过将一个 协议类型 与一个 实施类型、一个 实现 或一个 工厂 相关联来实现。最好从 main.swift 中调用您的 Dependency Configurator
  • 然后您可以调用 inject(typeToInject)根据您的依赖项配置器中的启动项解析一个指定协议或类型的实例

文档

Kraken 尚未完全文档化,但它附带了一个示例项目,可以让您尝试所有功能,并熟悉 API。您可以在 Trigger.xcworkspace 中找到它。

如果您有任何疑问,可以提出问题。

要运行示例项目,首先克隆仓库,然后从 Example 目录运行 pod install

功能

  • 作用域。 Kraken 支持 3 种不同的作用域(或生命周期策略):原型单例早期单例
  • 命名定义。 您可以为协议或类型注册一个 实施类型、一个 实现 或一个 工厂
  • 运行时参数。 您可以注册接受多达 3 个运行时参数的工厂(您可以通过创建扩展来增加运行时参数的数量);
  • 多个定义。 您可以为每个类型或协议注册多个 实施类型实现工厂
  • 循环依赖。 Kraken 可以解决循环依赖;
  • 自动接线。 Kraken 可以推断组件在构造函数中注入的依赖关系并自动解决它们。
  • 易于配置。 无复杂的容器层次结构,无不必要的功能;
  • 线程安全。 注册和解决组件是线程安全的;
  • 有用的错误信息。如果运行时无法解决某个问题,Kraken会抛出一个完整描述问题的错误;

基本用法

创建一个依赖配置文件,其中引导你的依赖,就像下面示例中所展示的那样

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构建的。

手动安装

  1. 下载并将/Kraken文件夹放入你的项目中。
  2. 恭喜您!

作者

Syed Sabir Salman-Al-Musawi, [email protected]

我还要感谢在开发阶段给予巨大支持的Sharafat Ibn Mollah Mosharraf

Kraken遵循MIT许可证。有关更多信息,请参阅LICENSE文件。

README.md文件顶部的人脸GIF来自于www.krakenstudios.blogspot.com