Skip to content

Commit 039ebda

Browse files
committed
ModuleScanner를 통해 생성한 Module에서 Instance를 캡처하여 재사용되던 문제 수정
1 parent 8be7e33 commit 039ebda

File tree

6 files changed

+139
-101
lines changed

6 files changed

+139
-101
lines changed

Sources/DIContainer/Module/AutoModule.swift

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@ import Foundation
22

33
open class AutoModuleBase {
44
public required init() {}
5+
6+
fileprivate func __newInstance() -> Self {
7+
Self()
8+
}
59
}
610

711
public protocol AutoModulable: AnyObject {
@@ -11,10 +15,17 @@ public protocol AutoModulable: AnyObject {
1115
public typealias AutoModule = AutoModuleBase & AutoModulable
1216

1317
#if DEBUG
14-
public extension AutoModulable {
18+
extension AutoModulable {
1519
var module: Module? {
16-
(self as? ModuleKeyType.Value)
17-
.map { instance in Module(ModuleKeyType.self) { instance } }
20+
guard
21+
let instance = self as? ModuleKeyType.Value,
22+
let autoModuleBase = instance as? AutoModuleBase
23+
else { return nil }
24+
25+
return Module(ModuleKeyType.self) {
26+
(autoModuleBase.__newInstance() as? ModuleKeyType.Value)
27+
?? instance
28+
}
1829
}
1930
}
2031
#endif

Tests/DIContainerTests/Tests/CachedModuleTests.swift renamed to Tests/DIContainerTests/Tests/AutoModuleIsNotCachedTests.swift

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
//
2-
// CachedModuleTests.swift
2+
// AutoModuleIsNotCachedTests.swift
33
// DIContainer
44
//
55
// Created by minsOne on 1/23/25.
@@ -11,15 +11,15 @@ import Testing
1111

1212
@MainActor
1313
@Suite(.serialized)
14-
struct CachedModuleTests {
14+
struct AutoModuleIsNotCachedTests {
1515
init() {
1616
Container.autoRegisterModules()
1717
}
1818
}
1919

20-
extension CachedModuleTests {
20+
extension AutoModuleIsNotCachedTests {
2121
@Test
22-
func cachedModule() throws {
22+
func scannedModule() throws {
2323
let service1 = getMockService()
2424
let service2 = getMockService()
2525

@@ -32,7 +32,7 @@ extension CachedModuleTests {
3232
service2.doSomething()
3333
do {
3434
let service = try #require(service2 as? MockServiceImpl)
35-
#expect(service.count == 2)
35+
#expect(service.count == 1)
3636
}
3737
}
3838

@@ -59,7 +59,7 @@ extension CachedModuleTests {
5959
}
6060
}
6161

62-
extension CachedModuleTests {
62+
private extension AutoModuleIsNotCachedTests {
6363
func getMockService() -> MockService {
6464
@Inject(MockServiceKey.self) var service
6565
return service

Tests/DIContainerTests/Tests/InjectTestsTests.swift renamed to Tests/DIContainerTests/Tests/Inject/InjectTestsTests.swift

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,13 @@ extension ContainerTests {
3636
}
3737

3838
private func injectBehavior() {
39-
@Inject(MockServiceKey.self) var service: MockService
40-
service.doSomething()
41-
#expect((service as? MockServiceImpl)?.count == 1)
39+
@Inject(MockServiceKey.self) var service1: MockService
40+
service1.doSomething()
41+
service1.doSomething()
42+
#expect((service1 as? MockServiceImpl)?.count == 2)
43+
44+
@Inject(MockServiceKey.self) var service2: MockService
45+
service2.doSomething()
46+
#expect((service2 as? MockServiceImpl)?.count == 1)
4247
}
4348
}

Tests/DIContainerTests/Tests/WeakInjectNilTests.swift renamed to Tests/DIContainerTests/Tests/Inject/WeakInjectNilTests.swift

File renamed without changes.
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
import Testing
2+
import XCTest
3+
4+
@testable import DIContainer
5+
6+
@MainActor
7+
@Suite(.serialized)
8+
struct WeakInjectTest {
9+
init() {
10+
// Given
11+
Container {
12+
Module(WeakMockServiceKey.self) { WeakMockServiceImpl() }
13+
Module(MockServiceImpl.self)
14+
Module(MockServiceFactoryKey.self) { MockServiceFactory() }
15+
}
16+
.build()
17+
}
18+
}
19+
20+
extension WeakInjectTest {
21+
@Test
22+
func containerRegistration1() {
23+
// When
24+
let weakMockService = WeakMockServiceKey.module?.resolve()
25+
let weakMockServiceImpl = WeakMockServiceKey.module?.resolve() as? WeakMockServiceKey.Value
26+
let weakMockServiceProtocol = WeakMockServiceKey.module?.resolve() as? WeakMockService
27+
28+
// Then
29+
#expect(weakMockService != nil)
30+
#expect(weakMockServiceImpl != nil)
31+
#expect(weakMockServiceProtocol != nil)
32+
}
33+
34+
@Test
35+
func containerRegistration2() throws {
36+
// When
37+
@WeakInject(WeakMockServiceKey.self) var service1
38+
@WeakInject(MockServiceKey.self) var service2
39+
@WeakInject(MockServiceFactoryKey.self) var factory
40+
41+
// Then
42+
#expect(service1 != nil)
43+
#expect(service2 != nil)
44+
#expect(factory != nil)
45+
}
46+
47+
@Test
48+
func weakInjectBehavior1() throws {
49+
// When
50+
@WeakInject(WeakMockServiceKey.self) var _service1: WeakMockService?
51+
@WeakInject(MockServiceKey.self) var _service2: MockService?
52+
@WeakInject(WeakMockServiceKey.self) var _service3: WeakMockService?
53+
54+
// Then
55+
let service1 = try #require(_service1)
56+
service1.doSomething()
57+
service1.doSomething()
58+
#expect((service1 as? WeakMockServiceImpl)?.count == 2)
59+
60+
let service2 = try #require(_service2)
61+
service2.doSomething()
62+
service2.doSomething()
63+
#expect((service2 as? MockServiceImpl)?.count == 2)
64+
65+
let service3 = try #require(_service3)
66+
service3.doSomething()
67+
service3.doSomething()
68+
#expect((service3 as? WeakMockServiceImpl)?.count == 2)
69+
}
70+
71+
@Test
72+
func weakInjectBehavior2() throws {
73+
// When
74+
@WeakInject(WeakMockServiceKey.self) var _service1
75+
@WeakInject(MockServiceKey.self) var _service2
76+
@WeakInject(MockServiceKey.self) var _service3
77+
78+
// Then
79+
let service1 = try #require(_service1)
80+
service1.doSomething()
81+
service1.doSomething()
82+
#expect((service1 as? WeakMockServiceImpl)?.count == 2)
83+
84+
let service2 = try #require(_service2)
85+
service2.doSomething()
86+
service2.doSomething()
87+
#expect((service2 as? MockServiceImpl)?.count == 2)
88+
89+
let service3 = try #require(_service3)
90+
service3.doSomething()
91+
service3.doSomething()
92+
#expect((service3 as? MockServiceImpl)?.count == 2)
93+
}
94+
95+
@Test
96+
func factoryBehavior() throws {
97+
@WeakInject(MockServiceFactoryKey.self) var factory
98+
let _service1 = factory?.makeWeakService()
99+
let _service2 = factory?.makeWeakService()
100+
101+
let service1 = try #require(_service1)
102+
service1.doSomething()
103+
service1.doSomething()
104+
#expect((service1 as? WeakMockServiceImpl)?.count == 2)
105+
106+
let service2 = try #require(_service2)
107+
service2.doSomething()
108+
service2.doSomething()
109+
#expect((service2 as? WeakMockServiceImpl)?.count == 2)
110+
}
111+
}

Tests/DIContainerTests/Tests/WeakInjectTests.swift

Lines changed: 0 additions & 89 deletions
This file was deleted.

0 commit comments

Comments
 (0)