Created
November 4, 2023 11:34
-
-
Save calvingit/67de0910db1162be91be77a18484c706 to your computer and use it in GitHub Desktop.
依赖管理工具
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// 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