Skip to content

Commit d086208

Browse files
committed
Generic Container with support for TargetResolver
1 parent 38ecf81 commit d086208

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+989
-433
lines changed

Example/KnitExample.xcodeproj/project.pbxproj

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -399,7 +399,7 @@
399399
INFOPLIST_KEY_UILaunchScreen_Generation = YES;
400400
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
401401
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
402-
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
402+
IPHONEOS_DEPLOYMENT_TARGET = 16.2;
403403
LD_RUNPATH_SEARCH_PATHS = (
404404
"$(inherited)",
405405
"@executable_path/Frameworks",
@@ -429,7 +429,7 @@
429429
INFOPLIST_KEY_UILaunchScreen_Generation = YES;
430430
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
431431
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
432-
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
432+
IPHONEOS_DEPLOYMENT_TARGET = 16.2;
433433
LD_RUNPATH_SEARCH_PATHS = (
434434
"$(inherited)",
435435
"@executable_path/Frameworks",
@@ -450,7 +450,7 @@
450450
CODE_SIGN_STYLE = Automatic;
451451
CURRENT_PROJECT_VERSION = 1;
452452
GENERATE_INFOPLIST_FILE = YES;
453-
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
453+
IPHONEOS_DEPLOYMENT_TARGET = 16.2;
454454
MARKETING_VERSION = 1.0;
455455
PRODUCT_BUNDLE_IDENTIFIER = com.cashapp.KnitExampleTests;
456456
PRODUCT_NAME = "$(TARGET_NAME)";
@@ -468,7 +468,7 @@
468468
CODE_SIGN_STYLE = Automatic;
469469
CURRENT_PROJECT_VERSION = 1;
470470
GENERATE_INFOPLIST_FILE = YES;
471-
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
471+
IPHONEOS_DEPLOYMENT_TARGET = 16.2;
472472
MARKETING_VERSION = 1.0;
473473
PRODUCT_BUNDLE_IDENTIFIER = com.cashapp.KnitExampleTests;
474474
PRODUCT_NAME = "$(TARGET_NAME)";

Example/KnitExample/ContentView.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ struct ContentView: View {
2121
}
2222

2323
struct ContentView_Previews: PreviewProvider {
24+
static let assembler = ScopedModuleAssembler<Resolver>([KnitExampleAssembly()])
2425
static var previews: some View {
25-
let resolver = ModuleAssembler([KnitExampleAssembly()]).resolver
26-
return ContentView(resolver: resolver)
26+
return ContentView(resolver: assembler.resolver)
2727
}
2828
}

Example/KnitExample/KnitExampleApp.swift

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,14 @@ import Knit
88
@main
99
struct KnitExampleApp: App {
1010

11-
let resolver: Resolver
11+
let assembler: ScopedModuleAssembler<Resolver>
12+
var resolver: Resolver { assembler.resolver }
1213

1314
@MainActor
1415
init() {
15-
resolver = ModuleAssembler([KnitExampleAssembly()]).resolver
16+
assembler = ScopedModuleAssembler<Resolver>(
17+
[KnitExampleAssembly()]
18+
)
1619
}
1720

1821
var body: some Scene {

Example/KnitExample/KnitExampleAssembly.swift

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,7 @@ final class KnitExampleAssembly: ModuleAssembly {
1313

1414
static var dependencies: [any ModuleAssembly.Type] { [] }
1515

16-
func assemble(container: Container) {
17-
container.addBehavior(ServiceCollector())
18-
16+
func assemble(container: Container<TargetResolver>) {
1917
container.register(ExampleService.self) { ExampleService.make(resolver: $0) }
2018

2119
// @knit alias("example")

Example/KnitExample/KnitExampleUserAssembly.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ final class KnitExampleUserAssembly: ModuleAssembly {
1313

1414
static var dependencies: [any ModuleAssembly.Type] { [] }
1515

16-
func assemble(container: Container) {
16+
func assemble(container: Container<TargetResolver>) {
1717
container.register(UserService.self) { _ in UserService() }
1818
}
1919
}

Example/KnitExampleTests/TestModuleAssembler.swift

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,18 @@
33
//
44

55
import Foundation
6-
import Knit
6+
@testable import Knit
77
@testable import KnitExample
88

99
extension KnitExampleAssembly {
1010
@MainActor
1111
static func makeAssemblerForTests() -> ModuleAssembler {
12-
ModuleAssembler([KnitExampleAssembly()])
12+
ModuleAssembler(
13+
[KnitExampleAssembly()],
14+
preAssemble: { container in
15+
Knit.Container<Knit.Resolver>._instantiateAndRegister(_swinjectContainer: container)
16+
}
17+
)
1318
}
1419

1520
static func makeArgumentsForTests() -> KnitExampleRegistrationTestArguments {
@@ -26,6 +31,11 @@ extension KnitExampleAssembly {
2631
extension KnitExampleUserAssembly {
2732
@MainActor
2833
static func makeAssemblerForTests() -> ModuleAssembler {
29-
ModuleAssembler([KnitExampleUserAssembly(), KnitExampleAssembly()])
34+
ModuleAssembler(
35+
[KnitExampleUserAssembly(), KnitExampleAssembly()],
36+
preAssemble: { container in
37+
Knit.Container<Knit.Resolver>._instantiateAndRegister(_swinjectContainer: container)
38+
}
39+
)
3040
}
3141
}

Package.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ let package = Package(
88
name: "Knit",
99
platforms: [
1010
.macOS(.v14),
11-
.iOS(.v15),
11+
.iOS(.v16),
1212
],
1313
products: [
1414
.library(name: "Knit", targets: ["Knit"]),

Sources/Knit/Container+MainActor.swift renamed to Sources/Knit/Container+MainActorRegistration.swift

Lines changed: 46 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,9 @@
44

55
import Swinject
66

7-
// This code should move into the Swinject library.
8-
// There is an open pull request to make this change https://github.com/Swinject/Swinject/pull/570
7+
// MARK: - MainActor Registration Methods
98

10-
// MARK: - MainActor registration
11-
extension Container {
9+
extension Knit.Container {
1210

1311
/// Adds a registration for the specified service with the factory closure to specify how the service is
1412
/// resolved with dependencies which must be resolved on the main actor.
@@ -27,18 +25,20 @@ extension Container {
2725
public func register<Service>(
2826
_ serviceType: Service.Type,
2927
name: String? = nil,
30-
mainActorFactory: @escaping @MainActor (Resolver) -> Service
28+
mainActorFactory: @escaping @MainActor (TargetResolver) -> Service
3129
) -> ServiceEntry<Service> {
32-
return register(serviceType, name: name) { r in
33-
MainActor.assumeIsolated {
34-
return mainActorFactory(r)
30+
return _unwrappedSwinjectContainer.register(serviceType, name: name) { r in
31+
let resolver = r.resolve(Container<TargetResolver>.self)!.resolver
32+
return MainActor.assumeIsolated {
33+
return mainActorFactory(resolver)
3534
}
3635
}
3736
}
3837
}
3938

40-
// MARK: - MainActor registration with Arguments
41-
extension Container {
39+
// MARK: - MainActor Registration Methods with Arguments
40+
41+
extension Knit.Container {
4242
/// Adds a registration for the specified service with the factory closure to specify how the service is
4343
/// resolved with dependencies which must be resolved on the main actor.
4444
///
@@ -56,10 +56,11 @@ extension Container {
5656
public func register<Service, Arg1>(
5757
_ serviceType: Service.Type,
5858
name: String? = nil,
59-
mainActorFactory: @escaping @MainActor (Resolver, Arg1) -> Service
59+
mainActorFactory: @escaping @MainActor (TargetResolver, Arg1) -> Service
6060
) -> ServiceEntry<Service> {
61-
return register(serviceType, name: name) { (resolver: Resolver, arg1: Arg1) in
62-
MainActor.assumeIsolated {
61+
return _unwrappedSwinjectContainer.register(serviceType, name: name) { (r: Swinject.Resolver, arg1: Arg1) in
62+
let resolver = r.resolve(Container<TargetResolver>.self)!.resolver
63+
return MainActor.assumeIsolated {
6364
return mainActorFactory(resolver, arg1)
6465
}
6566
}
@@ -82,10 +83,11 @@ extension Container {
8283
public func register<Service, Arg1, Arg2>(
8384
_ serviceType: Service.Type,
8485
name: String? = nil,
85-
mainActorFactory: @escaping @MainActor (Resolver, Arg1, Arg2) -> Service
86+
mainActorFactory: @escaping @MainActor (TargetResolver, Arg1, Arg2) -> Service
8687
) -> ServiceEntry<Service> {
87-
return register(serviceType, name: name) { (resolver: Resolver, arg1: Arg1, arg2: Arg2) in
88-
MainActor.assumeIsolated {
88+
return _unwrappedSwinjectContainer.register(serviceType, name: name) { (r: Swinject.Resolver, arg1: Arg1, arg2: Arg2) in
89+
let resolver = r.resolve(Container<TargetResolver>.self)!.resolver
90+
return MainActor.assumeIsolated {
8991
return mainActorFactory(resolver, arg1, arg2)
9092
}
9193
}
@@ -108,10 +110,11 @@ extension Container {
108110
public func register<Service, Arg1, Arg2, Arg3>(
109111
_ serviceType: Service.Type,
110112
name: String? = nil,
111-
mainActorFactory: @escaping @MainActor (Resolver, Arg1, Arg2, Arg3) -> Service
113+
mainActorFactory: @escaping @MainActor (TargetResolver, Arg1, Arg2, Arg3) -> Service
112114
) -> ServiceEntry<Service> {
113-
return register(serviceType, name: name) { (resolver: Resolver, arg1: Arg1, arg2: Arg2, arg3: Arg3) in
114-
MainActor.assumeIsolated {
115+
return _unwrappedSwinjectContainer.register(serviceType, name: name) { (r: Swinject.Resolver, arg1: Arg1, arg2: Arg2, arg3: Arg3) in
116+
let resolver = r.resolve(Container<TargetResolver>.self)!.resolver
117+
return MainActor.assumeIsolated {
115118
return mainActorFactory(resolver, arg1, arg2, arg3)
116119
}
117120
}
@@ -134,10 +137,11 @@ extension Container {
134137
public func register<Service, Arg1, Arg2, Arg3, Arg4>(
135138
_ serviceType: Service.Type,
136139
name: String? = nil,
137-
mainActorFactory: @escaping @MainActor (Resolver, Arg1, Arg2, Arg3, Arg4) -> Service
140+
mainActorFactory: @escaping @MainActor (TargetResolver, Arg1, Arg2, Arg3, Arg4) -> Service
138141
) -> ServiceEntry<Service> {
139-
return register(serviceType, name: name) { (resolver: Resolver, arg1: Arg1, arg2: Arg2, arg3: Arg3, arg4: Arg4) in
140-
MainActor.assumeIsolated {
142+
return _unwrappedSwinjectContainer.register(serviceType, name: name) { (r: Swinject.Resolver, arg1: Arg1, arg2: Arg2, arg3: Arg3, arg4: Arg4) in
143+
let resolver = r.resolve(Container<TargetResolver>.self)!.resolver
144+
return MainActor.assumeIsolated {
141145
return mainActorFactory(resolver, arg1, arg2, arg3, arg4)
142146
}
143147
}
@@ -160,10 +164,11 @@ extension Container {
160164
public func register<Service, Arg1, Arg2, Arg3, Arg4, Arg5>(
161165
_ serviceType: Service.Type,
162166
name: String? = nil,
163-
mainActorFactory: @escaping @MainActor (Resolver, Arg1, Arg2, Arg3, Arg4, Arg5) -> Service
167+
mainActorFactory: @escaping @MainActor (TargetResolver, Arg1, Arg2, Arg3, Arg4, Arg5) -> Service
164168
) -> ServiceEntry<Service> {
165-
return register(serviceType, name: name) { (resolver: Resolver, arg1: Arg1, arg2: Arg2, arg3: Arg3, arg4: Arg4, arg5: Arg5) in
166-
MainActor.assumeIsolated {
169+
return _unwrappedSwinjectContainer.register(serviceType, name: name) { (r: Swinject.Resolver, arg1: Arg1, arg2: Arg2, arg3: Arg3, arg4: Arg4, arg5: Arg5) in
170+
let resolver = r.resolve(Container<TargetResolver>.self)!.resolver
171+
return MainActor.assumeIsolated {
167172
return mainActorFactory(resolver, arg1, arg2, arg3, arg4, arg5)
168173
}
169174
}
@@ -186,10 +191,11 @@ extension Container {
186191
public func register<Service, Arg1, Arg2, Arg3, Arg4, Arg5, Arg6>(
187192
_ serviceType: Service.Type,
188193
name: String? = nil,
189-
mainActorFactory: @escaping @MainActor (Resolver, Arg1, Arg2, Arg3, Arg4, Arg5, Arg6) -> Service
194+
mainActorFactory: @escaping @MainActor (TargetResolver, Arg1, Arg2, Arg3, Arg4, Arg5, Arg6) -> Service
190195
) -> ServiceEntry<Service> {
191-
return register(serviceType, name: name) { (resolver: Resolver, arg1: Arg1, arg2: Arg2, arg3: Arg3, arg4: Arg4, arg5: Arg5, arg6: Arg6) in
192-
MainActor.assumeIsolated {
196+
return _unwrappedSwinjectContainer.register(serviceType, name: name) { (r: Swinject.Resolver, arg1: Arg1, arg2: Arg2, arg3: Arg3, arg4: Arg4, arg5: Arg5, arg6: Arg6) in
197+
let resolver = r.resolve(Container<TargetResolver>.self)!.resolver
198+
return MainActor.assumeIsolated {
193199
return mainActorFactory(resolver, arg1, arg2, arg3, arg4, arg5, arg6)
194200
}
195201
}
@@ -212,10 +218,11 @@ extension Container {
212218
public func register<Service, Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7>(
213219
_ serviceType: Service.Type,
214220
name: String? = nil,
215-
mainActorFactory: @escaping @MainActor (Resolver, Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7) -> Service
221+
mainActorFactory: @escaping @MainActor (TargetResolver, Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7) -> Service
216222
) -> ServiceEntry<Service> {
217-
return register(serviceType, name: name) { (resolver: Resolver, arg1: Arg1, arg2: Arg2, arg3: Arg3, arg4: Arg4, arg5: Arg5, arg6: Arg6, arg7: Arg7) in
218-
MainActor.assumeIsolated {
223+
return _unwrappedSwinjectContainer.register(serviceType, name: name) { (r: Swinject.Resolver, arg1: Arg1, arg2: Arg2, arg3: Arg3, arg4: Arg4, arg5: Arg5, arg6: Arg6, arg7: Arg7) in
224+
let resolver = r.resolve(Container<TargetResolver>.self)!.resolver
225+
return MainActor.assumeIsolated {
219226
return mainActorFactory(resolver, arg1, arg2, arg3, arg4, arg5, arg6, arg7)
220227
}
221228
}
@@ -238,10 +245,11 @@ extension Container {
238245
public func register<Service, Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8>(
239246
_ serviceType: Service.Type,
240247
name: String? = nil,
241-
mainActorFactory: @escaping @MainActor (Resolver, Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8) -> Service
248+
mainActorFactory: @escaping @MainActor (TargetResolver, Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8) -> Service
242249
) -> ServiceEntry<Service> {
243-
return register(serviceType, name: name) { (resolver: Resolver, arg1: Arg1, arg2: Arg2, arg3: Arg3, arg4: Arg4, arg5: Arg5, arg6: Arg6, arg7: Arg7, arg8: Arg8) in
244-
MainActor.assumeIsolated {
250+
return _unwrappedSwinjectContainer.register(serviceType, name: name) { (r: Swinject.Resolver, arg1: Arg1, arg2: Arg2, arg3: Arg3, arg4: Arg4, arg5: Arg5, arg6: Arg6, arg7: Arg7, arg8: Arg8) in
251+
let resolver = r.resolve(Container<TargetResolver>.self)!.resolver
252+
return MainActor.assumeIsolated {
245253
return mainActorFactory(resolver, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8)
246254
}
247255
}
@@ -264,10 +272,11 @@ extension Container {
264272
public func register<Service, Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8, Arg9>(
265273
_ serviceType: Service.Type,
266274
name: String? = nil,
267-
mainActorFactory: @escaping @MainActor (Resolver, Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8, Arg9) -> Service
275+
mainActorFactory: @escaping @MainActor (TargetResolver, Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8, Arg9) -> Service
268276
) -> ServiceEntry<Service> {
269-
return register(serviceType, name: name) { (resolver: Resolver, arg1: Arg1, arg2: Arg2, arg3: Arg3, arg4: Arg4, arg5: Arg5, arg6: Arg6, arg7: Arg7, arg8: Arg8, arg9: Arg9) in
270-
MainActor.assumeIsolated {
277+
return _unwrappedSwinjectContainer.register(serviceType, name: name) { (r: Swinject.Resolver, arg1: Arg1, arg2: Arg2, arg3: Arg3, arg4: Arg4, arg5: Arg5, arg6: Arg6, arg7: Arg7, arg8: Arg8, arg9: Arg9) in
278+
let resolver = r.resolve(Container<TargetResolver>.self)!.resolver
279+
return MainActor.assumeIsolated {
271280
return mainActorFactory(resolver, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9)
272281
}
273282
}

0 commit comments

Comments
 (0)