# Core Concepts

### Factory

A **Factory** is a stateless object encapsulating initialization details of some object by exposing a protocol or superclass return value.
Example: 
```swift
struct ViewControllerFactory {
    func home() -> UIViewController {
        return LoginViewController()
    }
}
```

### Dependency Container

A **Dependency Container** is an object capable of **registering** declarations and functions (bound to some **key**) that can later be **resolved** by some other contexts. 
It's like a dictionary of closures.
Registering closures can be configured so that they are always executed for every resolution (thus creating a new instance of returned object every time), or having a "singleton" behavior.
For "singletons", registered closures can create the object upon first resolution (`.singleton`) or directly upon registration (`.eagerSingleton`).

Example: 
```swift

container.register(for: "someKey") { return "Hello"}

...

let string = container.resolve("someKey") //Hello
```

Dependency containers are powerful but also dangerous, since are likeky to lead to dependency cycles.

Example of dependency cycle (this will lead to a runtime crash): 
```swift
container.register(for: "a") { SomeObject(container.resolve("b") }
container.register(for: "b") { SomeObject(container.resolve("c") }
container.register(for: "c") { SomeObject(container.resolve("a") }
```