47 lines
1.2 KiB
Swift
47 lines
1.2 KiB
Swift
//
|
|
// DependencyContainer.swift
|
|
// Vitaway
|
|
//
|
|
// Created by Artur Gurgul on 20/06/2025.
|
|
//
|
|
|
|
final class DependencyContainer: Resolver {
|
|
private var factories: [String: (Resolver) -> Any] = [:]
|
|
private var instances: [String: Any] = [:]
|
|
|
|
func register<T>(_ type: T.Type, cache: Bool = true, factory: @escaping (Resolver) -> T) {
|
|
let key = String(describing: type)
|
|
factories[key] = factory
|
|
|
|
if cache {
|
|
instances[key] = factory(self)
|
|
}
|
|
}
|
|
|
|
func registerSingleton<T>(_ type: T.Type, factory: @escaping (Resolver) -> T) {
|
|
let key = String(describing: type)
|
|
factories[key] = factory
|
|
}
|
|
|
|
func resolve<T>() -> T {
|
|
resolve(type: T.self)
|
|
}
|
|
|
|
func resolve<T>(type: T.Type) -> T {
|
|
let key = String(describing: T.self)
|
|
|
|
if let instance = instances[key] as? T {
|
|
return instance
|
|
}
|
|
|
|
guard let factory = factories[key], let instance = factory(self) as? T else {
|
|
fatalError("No registered entry for type \(key)")
|
|
}
|
|
return instance
|
|
}
|
|
|
|
static var shared: DependencyContainer {
|
|
(UIApplication.shared.delegate as! AppDelegate).sharedState.container
|
|
}
|
|
}
|
|
|