Latest 0.2.0
Homepage https://github.com/markvaldy/Kontena
License MIT
Platforms ios 8.0, osx 10.10, requires ARC
Dependencies TypeHelper
Frameworks Foundation
Authors

Kontena (コンテナ)

Version
License
Platform

IOC container in Swift

A simple Swift implementation of Service Locator / IOC container with limited DI functionality. Works well with Swift and Objective C classes.

Please check Demo project for a very basic example on how to use Kontena.

Additional notes

  • If you want to bind Swift protocol you must add @objc annotation.
  • Your bound object must inherit from NSObject to let the container automatically resolve dependencies.
  • Swift 1.2 is required to use this library.

Usage

Create the container

import Kontena

let container = Container() // init
let sharedContainer = Container.sharedInstance // as singleton

Merge two containers

// all bound objects from container2
// are merged and added to container1
container1.mergeWithContainer(container2)

Clear the container

container.clear()

Let the container automatically resolve dependencies of bound objects

container.resolveDependencies = true

Bind/register the instance/factory

@objc protocol SomeProtocol {}
class SomeBaseClass: NSObject {}
class SomeClass: SomeBaseClass, SomeProtocol {}

var instance = SomeClass()

// as singleton to the type of the instance
container.bind(instance)
// as singleton to the superclass type
container.bind(instance, toType: SomeBaseClass.self)
// as singleton to the protocol
container.bind(instance, toType: SomeProtocol.self)
// as singleton to the key
container.bind(instance, toKey: "some")

// factory = closure where the object is initialized
let factory = {
  () -> SomeClass in
  let some = SomeClass()
  // basic initialization
  return some
}

// to the type of the instance
container.bindFactory(factory)
// to the type of the instance
container.bindFactory(factory, toType: SomeBaseClass.self)
// to the protocol
container.bindFactory(factory, toType: SomeProtocol.self)
// to the key
container.bindFactory(factory, toKey: "some")

// you can bind factory as singleton as well
container.bindFactory(factory).asSingleton()

Resolve the object

Resolved object or nil is returned. If the factory was bound then object will be initialized lazily (for factories with the singleton scope – only at the first resolve call, for the prototype scope – at every resolve call).

If resolveDependencies was set to true then container will try to automatically resolve dependencies of the requested object (if they are already registered in the container and the requested object is a subclass of NSObject).

var resolvedByType = container.resolveType(SomeClass.self)
var resolvedByKey = container.resolveKey(key)

Using of custom operators

var instance = SomeClass()
var resolvedInstance: SomeClass?

// should be bound to the shared container
Container.sharedInstance.bind(instance)

// Resolve and inject from the container
-->resolvedInstance // prefix operator
resolvedInstance<-- // postfix operator

Installation

Kontena is available through CocoaPods. To install
it, simply add the following line to your Podfile:

pod 'Kontena'

Author

Vadym Markov, [email protected]

License

Kontena is available under the MIT license. See the LICENSE file for more info.

Latest podspec

{
    "name": "Kontena",
    "version": "0.2.0",
    "summary": "A simple Swift implementation of Service Locator / IOC container",
    "homepage": "https://github.com/markvaldy/Kontena",
    "license": {
        "type": "MIT",
        "file": "LICENSE.md"
    },
    "authors": {
        "Vadym Markov": "[email protected]"
    },
    "source": {
        "git": "https://github.com/markvaldy/Kontena.git",
        "tag": "0.2.0"
    },
    "social_media_url": "https://twitter.com/markvaldy",
    "platforms": {
        "ios": "8.0",
        "osx": "10.10"
    },
    "requires_arc": true,
    "source_files": "Source/**/*.{swift}",
    "dependencies": {
        "TypeHelper": [
            "~> 0.1.2"
        ]
    },
    "frameworks": "Foundation"
}

Pin It on Pinterest

Share This