Skip to content

Instantly share code, notes, and snippets.

@calvingit
Created November 4, 2023 11:34
Show Gist options
  • Save calvingit/67de0910db1162be91be77a18484c706 to your computer and use it in GitHub Desktop.
Save calvingit/67de0910db1162be91be77a18484c706 to your computer and use it in GitHub Desktop.
依赖管理工具
//
// DependencyContainer.swift
// DependencyContainer
//
// Created by zhangwen on 2023/11/1.
//
import Foundation
@objc
class DependencyContainer: NSObject {
private static let sharedContainer = DependencyContainer()
private var singletonDependencies: [String: Any] = [:]
private var cachedDependencies: [String: Any] = [:]
private let lock = NSLock()
private override init() {
super .init()
}
@objc static var shared: DependencyContainer {
return sharedContainer
}
@objc func registerSingletonInOC(_ dependency: NSObject) {
registerSingleton(dependency, name: nil)
}
internal func registerSingleton<T>(_ dependency: T, name: String? = nil) {
lock.lock()
defer { lock.unlock() }
let key = makeKey(for: T.self, name: name)
singletonDependencies[key] = dependency
}
@objc func registerCachedInOC(_ dependency: NSObject) {
registerCached(dependency, name: nil)
}
internal func registerCached<T>(_ dependency: T, name: String? = nil) {
lock.lock()
defer { lock.unlock() }
let key = makeKey(for: T.self, name: name)
cachedDependencies[key] = dependency
}
@objc func resolve(_ type: NSObject.Type) -> AnyObject {
resolve(type, name: nil)
}
internal func resolve<T>(_ type: T.Type = T.self, name: String? = nil) -> T {
lock.lock()
defer { lock.unlock() }
let key = makeKey(for: type, name: name)
guard let dependency = singletonDependencies[key] as? T ?? cachedDependencies[key] as? T else {
assertionFailure("Dependency of type \(type) with name \(name ?? "") has not been registered.")
fatalError("Dependency of type \(type) with name \(name ?? "") has not been registered.")
}
return dependency
}
@objc func removeCached(_ type: NSObject.Type) {
removeCached(type, name: nil)
}
internal func removeCached<T>(_ type: T.Type, name: String? = nil) {
lock.lock()
defer { lock.unlock() }
let key = makeKey(for: type, name: name)
cachedDependencies.removeValue(forKey: key)
}
@objc func clearCached() {
lock.lock()
defer { lock.unlock() }
cachedDependencies.removeAll()
}
private func makeKey<T>(for type: T.Type, name: String?) -> String {
let typeName = String(describing: type)
return name != nil ? "\(typeName)_\(name!)" : typeName
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment