https://github.com/vadymmarkov/kontena
IOC container in Swift
https://github.com/vadymmarkov/kontena
Last synced: 8 months ago
JSON representation
IOC container in Swift
- Host: GitHub
- URL: https://github.com/vadymmarkov/kontena
- Owner: vadymmarkov
- License: other
- Created: 2015-03-27T00:03:49.000Z (over 10 years ago)
- Default Branch: master
- Last Pushed: 2015-07-02T00:35:53.000Z (over 10 years ago)
- Last Synced: 2025-03-23T12:45:44.203Z (8 months ago)
- Language: Swift
- Size: 156 KB
- Stars: 6
- Watchers: 3
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- Contributing: CONTRIBUTING.md
- License: LICENSE.md
Awesome Lists containing this project
README
# Kontena (コンテナ)
[](http://cocoadocs.org/docsets/Kontena)
[](http://cocoadocs.org/docsets/Kontena)
[](http://cocoadocs.org/docsets/Kontena)
## 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
```swift
import Kontena
let container = Container() // init
let sharedContainer = Container.sharedInstance // as singleton
```
### Merge two containers
```swift
// all bound objects from container2
// are merged and added to container1
container1.mergeWithContainer(container2)
```
### Clear the container
```swift
container.clear()
```
### Let the container automatically resolve dependencies of bound objects
```swift
container.resolveDependencies = true
```
### Bind/register the instance/factory
```swift
@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```).
```swift
var resolvedByType = container.resolveType(SomeClass.self)
var resolvedByKey = container.resolveKey(key)
```
### Using of custom operators
```swift
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](http://cocoapods.org). To install
it, simply add the following line to your Podfile:
```ruby
pod 'Kontena'
```
## Author
Vadym Markov, impressionwave@gmail.com
## License
**Kontena** is available under the MIT license. See the LICENSE file for more info.