Skip to content

Commit 00e5f5e

Browse files
Refactors and made ServiceContainer thread safe
1 parent 4fd2fa1 commit 00e5f5e

File tree

4 files changed

+32
-26
lines changed

4 files changed

+32
-26
lines changed

CodeEdit.xcodeproj/project.pbxproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1370,7 +1370,6 @@
13701370
58798244292E78D80085B254 /* CodeFile */,
13711371
58FD7603291EA1CB0051D6E4 /* Commands */,
13721372
284DC84B2978B5EB00BF2770 /* Contributors */,
1373-
300051652BBD3A4400A98562 /* DependencyInjection */,
13741373
043C321227E31FE8006AE443 /* Documents */,
13751374
6C147C3C29A328020089B630 /* Editor */,
13761375
6C6BD6ED29CD123000235D17 /* Extensions */,
@@ -2138,6 +2137,7 @@
21382137
58D01C85293167DC00C5B6B4 /* Utils */ = {
21392138
isa = PBXGroup;
21402139
children = (
2140+
300051652BBD3A4400A98562 /* DependencyInjection */,
21412141
6C48D8EF2972DAC300D6D205 /* Environment */,
21422142
58D01C87293167DC00C5B6B4 /* Extensions */,
21432143
58D01C8F293167DC00C5B6B4 /* KeyChain */,

CodeEdit/AppDelegate.swift

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,6 @@ final class AppDelegate: NSObject, NSApplicationDelegate, ObservableObject {
236236
private func setupServiceContainer() {
237237
// Example for how services will be instantiated
238238
// ServiceContainer.register(
239-
// type: PasteboardService.self,
240239
// PasteboardService()
241240
// )
242241
}

CodeEdit/Utils/DependencyInjection/ServiceContainer.swift

Lines changed: 31 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -5,40 +5,48 @@
55
// Created by Abe Malla on 4/3/24.
66
//
77

8-
enum ServiceContainer {
9-
private static var factories: [String: () -> Any] = [:]
10-
private static var cache: [String: Any] = [:]
8+
import Foundation
119

12-
static func register<Service>(type: Service.Type, _ factory: @autoclosure @escaping () -> Service) {
13-
factories[String(describing: type.self)] = factory
10+
enum ServiceContainer {
11+
private static var factories: [ObjectIdentifier: () -> Any] = [:]
12+
private static var cache: [ObjectIdentifier: Any] = [:]
13+
private static let queue = DispatchQueue(label: "ServiceContainerQueue")
14+
15+
static func register<Service>(_ factory: @autoclosure @escaping () -> Service) {
16+
queue.sync {
17+
let key = ObjectIdentifier(Service.Type.self)
18+
factories[key] = factory
19+
}
1420
}
1521

1622
static func resolve<Service>(_ resolveType: ServiceType = .singleton, _ type: Service.Type) -> Service? {
17-
let serviceName = String(describing: type.self)
23+
let serviceId = ObjectIdentifier(Service.Type.self)
1824

19-
switch resolveType {
20-
case .singleton:
21-
if let service = cache[serviceName] as? Service {
22-
return service
23-
} else {
24-
let service = factories[serviceName]?() as? Service
25+
return queue.sync {
26+
switch resolveType {
27+
case .singleton:
28+
if let service = cache[serviceId] as? Service {
29+
return service
30+
} else {
31+
let service = factories[serviceId]?() as? Service
32+
33+
if let service = service {
34+
cache[serviceId] = service
35+
}
36+
37+
return service
38+
}
39+
case .newSingleton:
40+
let service = factories[serviceId]?() as? Service
2541

2642
if let service = service {
27-
cache[serviceName] = service
43+
cache[serviceId] = service
2844
}
2945

3046
return service
47+
case .new:
48+
return factories[serviceId]?() as? Service
3149
}
32-
case .newSingleton:
33-
let service = factories[serviceName]?() as? Service
34-
35-
if let service = service {
36-
cache[serviceName] = service
37-
}
38-
39-
return service
40-
case .new:
41-
return factories[serviceName]?() as? Service
4250
}
4351
}
4452
}

CodeEdit/Utils/DependencyInjection/ServiceWrapper.swift

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77

88
@propertyWrapper
99
struct Service<Service> {
10-
1110
var service: Service
1211

1312
init(_ type: ServiceType = .singleton) {

0 commit comments

Comments
 (0)