@@ -65,6 +65,7 @@ public final class SimpleResolver: SimpleResolvable, SimpleStorable, CustomDebug
65
65
enum ErrorDomain : Error {
66
66
case factoryMissing( identifier: String )
67
67
case typeMissmatch( expected: String , got: String )
68
+ case unknown
68
69
}
69
70
70
71
/// One singleton to rule them all
@@ -99,36 +100,49 @@ public final class SimpleResolver: SimpleResolvable, SimpleStorable, CustomDebug
99
100
resolver: SimpleResolvable ) throws -> Service {
100
101
let serviceIdentifier = buildIdentifier ( type: type, forIdentifier: customIdentifier)
101
102
102
- // load form store
103
- var fetchedService : Any ?
103
+ var resolvedService : Service ?
104
+ var resolveError : Error ?
104
105
queue. sync {
105
- fetchedService = store [ serviceIdentifier]
106
- }
107
- if let service = fetchedService as? Service {
108
- return service
106
+ do {
107
+ resolvedService = try loadOrResolve (
108
+ serviceIdentifier: serviceIdentifier,
109
+ factoryParameters: factoryParameters,
110
+ resolver: resolver
111
+ )
112
+ } catch {
113
+ resolveError = error
114
+ }
109
115
}
110
116
111
- // load service from factory
112
- var factory : Factoryable ?
113
- queue. sync {
114
- factory = factories [ serviceIdentifier]
115
- }
116
- guard let factory = factory else {
117
- throw ErrorDomain . factoryMissing ( identifier: serviceIdentifier)
117
+ guard let resolvedService else {
118
+ guard let resolveError else {
119
+ throw ErrorDomain . unknown
120
+ }
121
+ throw resolveError
118
122
}
119
123
120
- // Apply factory closure
121
- let builtType = try factory. build ( factoryParameters: factoryParameters, resolver: resolver)
122
- guard let service = builtType as? Service else {
123
- throw ErrorDomain . typeMissmatch ( expected: " \( Service . Type. self) " , got: " \( builtType. self) " )
124
- }
124
+ return resolvedService
125
+ }
126
+
127
+ private func loadOrResolve< Service> ( serviceIdentifier: String ,
128
+ factoryParameters: [ String : Any ] ? ,
129
+ resolver: SimpleResolvable ) throws -> Service {
130
+ if let fetchedObject = store [ serviceIdentifier] ,
131
+ let fetchedService = fetchedObject as? Service {
132
+ return fetchedService
133
+ } else {
134
+ guard let factory = factories [ serviceIdentifier] else {
135
+ throw ErrorDomain . factoryMissing ( identifier: serviceIdentifier)
136
+ }
137
+
138
+ let builtType = try factory. build ( factoryParameters: factoryParameters, resolver: resolver)
139
+ guard let service = builtType as? Service else {
140
+ throw ErrorDomain . typeMissmatch ( expected: " \( Service . Type. self) " , got: " \( builtType. self) " )
141
+ }
125
142
126
- // keep in store built object for later
127
- queue. sync {
128
143
store [ serviceIdentifier] = service
144
+ return service
129
145
}
130
-
131
- return service
132
146
}
133
147
134
148
// MARK: internal
0 commit comments